设计模式--装饰模式

来源:互联网 发布:大数据实验室解决方案 编辑:程序博客网 时间:2024/06/09 03:48
1.装饰者模式
1.1定义:动态的灵活的给对象添加功能
1.2组成:
抽象构件 Component(interface/abstract class):定义抽象功能
抽象构件的具体实现ConcreteComponent:抽象功能的具体实现(extend/implmebt Component)
装饰角色Decorator:通过代理ConcreteComponent,实现抽象功能(extend/implmebt Component)
具体装饰角色:继承了Decorator,并添加具体的装饰功能
装饰者模式最大的好处就是动态灵活的增加或者去掉装饰功能,可以层层添加装饰
1.3优点
1)装饰器和具体抽象功能的具体实现,实现了解耦,可以独立发展和修改
2)装饰器是直接继承的一种替代(如果没有装饰器可能会直接集成实现构建,重写具体方法),装饰器不直接继承具体实现类,而是直接继承/实现了抽象功能,而这种继承或者实现巧妙的基于代Componet的实现类(可能是原生的ConcreteComponent也可能是已经添加了某种具体装饰器的Decorator_X),具体的装饰器继承了抽象装饰器,添加了各种具体功能,装饰器归根结底返回的都是一个Component,是is -a的关系,这个也是装饰器模式可以动态层层添加删除的基础。
1.4类图,ConcreteDecorator这个可以有多个

1.5 demo
interface Component{
public void dosomething();
}
class ConcreteComponent{
public void dosomething(){//具体实现}
}
abstract classDecorator implement Component{
public Decorator(Component c){
this.component=c;
}
private Component component;//通过注入一个component实现,代理实现具体的功能
public void dosomething(){ component.dosomething();}
}
class Decorator1 extend Decorator{
public Decorator1(Component c){
super(c);
}
//重写父类方法,添加具体的装饰
public void dosomething(){
//添加装饰
super.doSomething();
//添加装饰
}
}
class Decorator2 extend Decorator{
//重写父类方法,添加具体的装饰
public void dosomething(){
//添加装饰
super.doSomething();
//添加装饰
}
}

class client{
pulbic static void main(String args[]){
Component c = new ConcreterComponent();
//添加第一层装饰,返回的仍是一个Component,仍可以作为抽象的具体实现,set到下一个装饰器中
c = new Decorator1 (c);
c = new Decorator2 (c);//添加第二次装饰
//....动态添加或者删除装饰器,最后返回的还是一个Component
}
}

原创粉丝点击