第 4 卷
}else{//不属于自己的处理级别 //判断是否有下一个处理者
if(this.nextHandler != null){ response =
this.nextHandler.handleMessage(request);
}else{ //没有适当的处理者,业务自行处理
} }
return response;
} //设置下一个处理者是谁
public void setNext(Handler _handler){ this.nextHandler = _handler;
} //每个处理者都有一个处理级别
protected abstract Level getHandlerLevel();
//每个处理者都必须实现处理任务 protected abstract Response echo(Request request);
}
抽象的处理者实现三个职责:
一是定义一个请求的处理方法 handleMessage,唯一对外开放的方法;
二是定义一个链的编排方法 setNext,设置下一个处理者;
三是定义了具体的请求者必须实现的两个方法:定义自己能够处理的级别 getHandlerLevel 和具体的处理任务 echo。
注意事项:
链中节点数量需要控制,避免出现超长链的情况,一般的做法是在 Handler 中设置一个最大节点数量,在 setNext 方法中判断是否已经是超过其阈值,超过则不允许
该链建立,避免无意识地破坏系统性能。
11.装饰模式(Decorator Pattern)
定义:Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclassing for
extending functionality.(动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。)
- Component 抽象构件
始的对象,如上面的成绩单。
注意:在装饰模式中,必然有一个最基本、最核心、最原始的接口或抽象类充当 Component 抽象构件。
- ConcreteComponent 具体构件
ConcreteComponent 是最核心、最原始、最基本的接口或抽象类的实现,你要装饰的就是它。
- Decorator 装饰角色
一般是一个抽象类,做什么用呢?实现接口或者抽象方法,它里面可不一定有抽象的方法呀,在它的属性里必然有一个 private 变量指向 Component 抽象构件。
- 具体装饰角色
ConcreteDecoratorA 和 ConcreteDecoratorB 是两个具体的装饰类,你要把你最核心的、最原始的、最基本的东西装饰成其他东西,上面的例子就是把一个比较平庸
的成绩单装饰成家长认可的成绩单。
使用场景:
- 需要扩展一个类的功能,或给一个类增加附加功能。
- 需要动态地给一个对象增加功能,这些功能可以再动态地撤销。
- 需要为一批的兄弟类进行改装或加装功能,当然是首选装饰模式。
12.策略模式(Strategy Pattern)
定义:Define a family of algorithms,encapsulate each one,and make them interchangeable.(定义一组算法,将每个算法都封装起来,并且使它们之间可以
互换。)
- Context 封装角色
它也叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。
- Strategy 抽象策略角色
策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。各位看官可能要问了,类图中的 AlgorithmInterface 是什么意思,嘿嘿,
algorithm 是“运算法则”的意思,结合起来意思就明白了吧。
- ConcreteStrategy 具体策略角色(多个)
实现抽象策略中的操作,该类含有具体的算法。
使用场景:
- 多个类只有在算法或行为上稍有不同的场景。
- 算法需要自由切换的场景。
- 需要屏蔽算法规则的场景。
注意事项:具体策略数量超过 4 个,则需要考虑使用混合模式
策略模式扩展:策略枚举
public enum Calculator { //加法运算
ADD("+"){ public int exec(int a,int b){
return a+b;
} },
//减法运算 SUB("-"){
public int exec(int a,int b){ return a - b;
} };
String value = "";
//定义成员值类型 private Calculator(String _value){
this.value = _value;
} //获得枚举成员的值
public String getValue(){ return this.value;
} //声明一个抽象函数
public abstract int exec(int a,int b);
}
定义:
- 它是一个枚举。
- 它是一个浓缩了的策略模式的枚举。
注意:
受枚举类型的限制,每个枚举项都是 public、final、static 的,扩展性受到了一定的约束,因此在系统开发中,策略枚举一般担当不经常发生变化的角色。
致命缺陷:
所有的策略都需要暴露出去,由客户端决定使用哪一个策略。
13.适配器模式(Adapter Pattern)
定义:Convert the interface of a class into another interface clients expect.Adapter lets classes work together that couldn't otherwise because of
incompatible interfaces.(将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。)
类适配器: