大家好,我是北军。今天介绍另一种常用的设计模式——装饰器模式。1.什么是装饰者模式?将附加职责附加到动态保持相同接口的对象。装饰器为扩展功能提供了一种灵活的子类化替代方案。装饰者模式(DecoratorPattern):动态地给一个对象增加额外的职责,只是装饰者模式比子类化增加功能更灵活。用人话来说:一般我们经常用继承来扩展一个类。随着扩展功能的增加,子类也会扩展。这时,期望在不改变类对象及其类定义的情况下,为对象添加额外的功能。这就是装饰者模式。2.装饰者模式的定义①Component抽象组件Component是一个接口或者抽象类,它定义了我们的核心对象,也就是最原始的对象。②ConcreteComponent具体组件ConcreteComponent是接口或抽象类最核心、最原始、最基本的实现,是你要装饰的。③Decorator的作用一般是实现接口或抽象方法的抽象类。它里面不一定有抽象方法,它的属性中一定有一个私有变量指向Component的抽象组件。④ConcreteDecorator具体装饰作用ConcreteDecoratorA和ConcreteDecoratorB是两个具体的装饰类,需要把你最核心的、最原始的、最基本的东西装饰成其他的东西3.装饰器模式的通用代码实现/***abstractcomponent*/publicabstractclass组件{publicabstractvoidoperator();}/***具体组件*/publicclassConcreteComponentextendsComponent{@Overridepublicvoidoperator(){System.out.println("doSomething");}}/***抽象装饰器*/publicabstractclassDecoratorextendsComponent{privateComponentcomponent;publicDecorator(Componentcomponent){this.component=component;}//委托给装饰器执行@Overridepublicvoidoperator(){this.component.operator();}}publicclassConcreteDecorator1extendsDecorator{//定义装饰器publicConcreteDecorator1(Componentcomponent){super(component);}//定义自己的修饰方法publicvoidmethod1(){System.out.println("修饰方法method1");}@Overridepublicvoidoperator(){this.method1();超级运算符();}}客户端测试:ppublicclassDecoratorClient{publicstaticvoidmain(String[]args){组件component=newConcreteComponent();//第一个装饰组件=newConcreteDecorator1(component);//第二个装饰组件=newConcreteDecorator2(component);//装饰后运行component.operator();}}打印结果:4、装饰器模式的优点①装饰器模式可以动态扩展一个实现类的功能②装饰器和被装饰类可以独立开发,没有交互耦合。换句话说,Component类不需要知道Decorator类。Decorator类从外部扩展了Component类的功能,Decorator不需要知道具体的组件。③装饰模式是继承关系的替代。再来看装饰类Decorator。不管装饰多少层,返回的对象仍然是Component,实现了is-a关系。②.需要动态地给一个对象添加功能,这些功能可以动态的撤销。
