装饰模式
很久没写了,大部分文章都是前期写了一半,然后搁着想着等有空了再去完善下,但大多都是处在还没上传的阶段。最近空闲时间较多所以整理一些出来。 程序有时候像人生经历了才知道原来可以这样设计。设计模式就是一些经验的终结。模式是死的,有时候模式不能直接套用,而是根据自己的理解进行使用,有时可以多个模式组合使用; 此篇文章借鉴了《设计模式之禅》这本书,作者举例鲜明易懂推荐阅读;
设计模式的定义: 动态的给一个对象添加一些额外的职责。 就增加功能来说,装饰模式相比于子类更加灵活;
类图:
类图出自《设计模式之禅》 根据类图贴出源码来更容易理解;
被装饰抽象类
public abstract class Component{
//抽象方法
public abstract void operate();
}
被装饰实现类
public class ConcreteComponent extends Component{
@Override
public void operate(){
System.out.println("do something..");
)
}
装饰器抽象类
public abstract class Decorator extends Component{
private Component component = null;
public Decorator(Component _component){
this.component = _component;
}
@Override
public void operate(){
this.component.operate();
}
}
装饰器实现一类
public class ConcreteDecoratorOne extends Decorator{
public ConcreteDecoratorOne(Component _component){
super(_component);
}
public void doSomething(){
System.out.println("One do something.");
}
public void operate(){
this.doSomething();
super.operate();
}
}
装饰器实现二类
public class ConcreteDecoratorTwo extends Decorator{
public ConcreteDecoratorTwo(Component _component){
super(_component);
}
public void doSomething(){
System.out.println("Two do something.");
}
public void operate(){
this.doSomething();
super.operate();
}
}
具体装饰调用
public class Client{
public static void main(String[] args){
Component component = new ConcreteComponent();
//装饰
component = new ConcreteDecoratorOne(component);
//装饰
component = new ConcreteDecoratorTwo(component);
//运行装饰后的对象
component.operate();
}
}
装饰模式的优点:
- 装饰和被装饰类可以独立发展,而不会互相耦合。换句话说Component类不需要知道Decorator类,Decorator类是从外部来扩展Component类的功能,而Decorator也不用知道具体的构件;
- 装饰模式是继承关系的一个替代方案。不管装饰多少层返回的对象还是Component;
- 装饰模式可以动态的扩展一个实现类的功能;
装饰的缺点:
- 对于装饰模式如果多层装饰的话会变的很复杂。因此尽量减少装饰器数量,以便降低系统复杂度;
使用场景:
- 需要扩展一个类的功能,或给一个类增加附加功能;
- 需要动态的给一个对象增加功能,这些功能可以再动态的撤销;
- 需要为一批兄弟类镜像改装或加装功能,当然首选装饰模式;
以上就是装饰模式。具体使用时刻参考是否符合业务场景,不可硬搬;