扩展性"/>
责任链 系统的可扩展性
横向扩展(scale out)也叫水平扩展,
指用更多的节点支撑更大量的请求。例如1台机器支撑10000TPS,两台机器是否能支撑20000TPS?
纵向扩展(scale up)
也叫垂直扩展,扩展一个点的能力支撑更大的请求。通常通过提升硬件实现,例如把磁盘升级为SSD。
横向扩展通常是为了提升吞吐量,响应时间一般要求不受吞吐量影响即可。
因为本身在访问量比较小的时候,响应时间就是可接受的范围,例如去分布式缓存get一条数据的响应时间在毫秒级,理想情况如图5-1所示,只要在吞吐量不断提升的情况下保持这个响应时间就可以。当然,响应时间和吞吐量在资源一定的情况下,通常是互斥关系,如果要降低响应时间,可以通过纵向扩展,提升单机能力,或者改变数据存储结构,压缩等方式。
- 工厂模式
- 抽象工厂模式
- 观察者模式:很方便增加观察者,方便系统扩展
- 模板方法模式:很方便的实现不稳定的扩展点,完成功能的重用
- 适配器模式:可以很方便地对适配其他接口
- 代理模式:可以很方便在原来功能的基础上增加功能或者逻辑
- 责任链模式:可以很方便得增加拦截器/过滤器实现对数据的处理,比如struts2的责任链
- 策略模式:通过新增策略从而改变原来的执行策略
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
本教程将通过 Java 实例,一步一步向您讲解设计模式的概念。
行为型模式
责任链
目的
避免请求的发送者和接收者耦合在一起,让让多个对象都有可能接收请求;
将这些对象连成一条链,并沿着这条链发送该请求,直到有一个对象处理它为止。
类图
Handler:定义处理请求的接口,并且实现后继链(successor)
避免请求的发送者和接受者之间的耦合关系, 降低耦合。
代码实现
public abstract class Handler {protected Handler successor;public Handler(Handler successor) {this.successor = successor;}protected abstract void handleRequest(Request request);
}
public class ConcreteHandler1 extends Handler {public ConcreteHandler1(Handler successor) {super(successor);}@Overrideprotected void handleRequest(Request request) {if (request.getType() == RequestType.TYPE1) {System.out.println(request.getName() + " is handle by ConcreteHandler1");return;}if (successor != null) {successor.handleRequest(request);}}
}
public class ConcreteHandler2 extends Handler {public ConcreteHandler2(Handler successor) {super(successor);}@Overrideprotected void handleRequest(Request request) {if (request.getType() == RequestType.TYPE2) {System.out.println(request.getName() + " is handle by ConcreteHandler2");return;}if (successor != null) {successor.handleRequest(request);}}
}
public class Request {private RequestType type;private String name;public Request(RequestType type, String name) {this.type = type;this.name = name;}public RequestType getType() {return type;}public String getName() {return name;}
}
public enum RequestType {TYPE1, TYPE2
}
public class Client {public static void main(String[] args) {Handler handler1 = new ConcreteHandler1(null);Handler handler2 = new ConcreteHandler2(handler1);Request request1 = new Request(RequestType.TYPE1, "request1");handler2.handleRequest(request1);Request request2 = new Request(RequestType.TYPE2, "request2");handler2.handleRequest(request2);}
}
request1 is handle by ConcreteHandler1
request2 is handle by ConcreteHandler2
package chain_of_responsibility;public class Client {public static void main(String[] args) {Handler handler1 = new ConcreteHandler1(null);Handler handler2 = new ConcreteHandler2(handler1);Request request1 = new Request(RequestType.TYPE1, "request1");handler2.handleRequest(request1);Request request2 = new Request(RequestType.TYPE2, "request2");handler2.handleRequest(request2);}
}
客户端 关联 接口登录;
一个超级工厂创建其他工厂(根据id创建对象)。
该超级工厂又称为其他工厂的工厂;
接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。
每个生成的工厂都能按照工厂模式提供对象。
意图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
应用实例:
商务装(成套,一系列具体产品)、时尚装(成套,一系列具体产品),甚至对于一个家庭来说,可能有商务女装、商务男装、时尚女装、时尚男装,这些也都是成套的,即一系列具体产品。
家中,某一个衣柜(具体工厂)只能存放某一种这样的衣服(成套,一系列具体产品),每次拿这种成套的衣服时也自然要从这个衣柜中取出了。
所有的衣柜(具体工厂)都是衣柜类的(抽象工厂)某一个;
每一件成套的衣服包括具体的上衣(某一具体产品),裤子(某一具体产品),这些具体的上衣其实也都是上衣(抽象产品),具体的裤子也都是裤子(另一个抽象产品)。
系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
实现
更多推荐
责任链 系统的可扩展性
发布评论