顿搜
飞过闲红千叶,夕岸在哪
类目归类
如何使“对象功能的扩展”能够根据需要来动态地实现?同时避免“扩展功能的增多”带来的子类膨胀问题?从而使得任何“功能扩展变化”所导致的影响将为最低?
一般有两种方式可以实现给一个类或对象增加行为
动态的将新功能附加到对象上。在对象功能扩张方面,比继承更有弹性。要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。
装饰者模式涉及Component,ConcreteComponent,Decorator,ConcreteDecorator四个角色
public abstract Class Model{
public String name;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public abstrace String method();//实体中间层,实现超类的抽象方法
public Class Source extends Model{
@override
public String method(){
return super.getName;
}
}//实体类
public Class Source_A extends Source{
public Source_A (){
super.setName("I am Source_A");
}
}//装饰者中间层
public Class Decorate extends Model{
private Model obj;
public Decorate (Model obj){
this.obj= obj;
}
@override
public String method(){
return super.getName + obj.method();
}
}//装饰者实体
public Class Decorate_A extends Decorate{
public Decorate_A(Model obj){
super(obj);
super.setName("I am Decorate_A");
}
}public Class Test{
public static void main(String[] args){
Model obj = new Source_A();
obj = new Decorate_A(obj);
obj.method();
}
}1、优点
2、缺点
②、这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错,排错也很困难,对于多次 装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐
。
1、与适配器模式的比较
2、与组合模式的比较
3、与策略模式的比较
装饰者模式