装饰者模式其实就是添加附加功能的一种方式。就是说一个类已经有了基本功能,那么添加额外的功能要怎么添加才比较好。一般情况的话,你可以在该类中添加一个方法,然后在调用原来的方法之前或者之后调用,那么就相当于进行相应的装饰。这种方式不太好的方面是就是违反开闭原则。还有进行不够灵活,比如要各种装饰的搭配也不好解决。装饰模式可以通过多态的方式来解决这种问题,而且可以自由搭配。
注意装饰器不可以单独使用,它必须指定一个装饰器或者一个实际的被装饰的对象。
比如这里SwimDecorator和FlyDecorator都是装饰器,都有一个非空的构造器,必须指定装饰器或者是实际的被装饰对象(ConreteA也需要实现Decorator)。最终的闭环是实际的被装饰对象,而不是装饰类。
Decorator:
package cn.yishijie; public interface Decorator { void decorator(); }
ConcreteA:
package cn.yishijie; public class ConcreteA implements Decorator { @Override public void decorator() { System.out.println("concreteA ..."); } }
SwimDecorator:
package cn.yishijie; public class FlyDecorator implements Decorator { private Decorator decorator; public FlyDecorator(Decorator decorator) { this.decorator = decorator; } @Override public void decorator() { decorator.decorator(); System.out.println("add fly function..."); } }
FlyDocorator:
package cn.yishijie; public class SwimDecorator implements Decorator { private Decorator decorator; public SwimDecorator(Decorator decorator) { this.decorator = decorator; } @Override public void decorator() { decorator.decorator(); System.out.println("add swim function..."); } }
Client:
package cn.yishijie; public class Client { public static void main(String[] args) { ConcreteA concreteA = new ConcreteA(); concreteA.decorator(); FlyDecorator flyDecorator = new FlyDecorator(concreteA); flyDecorator.decorator(); SwimDecorator swimDecorator = new SwimDecorator(flyDecorator); swimDecorator.decorator(); } }
可以发现,这个装饰的作用可以随意搭配,就是各种装饰对象都是相互当作被装饰的对象。比如ConreateA需要相应的额外功能就可以添加一个装饰类,而且这个装饰类还可以复用,组成不同的组合。比如这里SwimDecorator和FlyDecorator都可以和ConcreteA搭配使用