1、什么是装饰模式
在不改变原有对象的基础上附加功能,相比生成子类更灵活。
2、装饰者模式的应用场景
动态的给一对象添加或撤销功能
3、装饰者模式的优缺点
优点:可以在不改变原有对象的基础上扩展功能,可以扩展多个功能按照想要的顺序去执行,以实现不同的效果。
缺点:更多的类,使程序复杂。
4、装饰者模式类图
5、装饰者模式定义
抽象组件:定义一个抽象接口,来规范被附加功能的类;
具体组件:将要被附加功能的类,实现抽象构建接口;
抽象装饰者:持有对具体构件角色的引用并定义与抽象构件角色一知的接口;
具体装饰:实现抽象装饰者角色,负责对具体构件添加额外功能。
6、装饰者代码实现:
定义一个抽象接口
public abstract class GatewayComponent {public abstract void service();}
定义被修饰角色
public class BasicComponentGateway extends GatewayComponent {public void service() {System.out.println("网关开始获取基本参数信息");}}
定义抽象装饰者角色:
public abstract class AbstractDecorator extends GatewayComponent {protected GatewayComponent componentGateway;public AbstractDecorator() {}public AbstractDecorator(GatewayComponent componentGateway) {this.componentGateway = componentGateway;}public void service() {componentGateway.service();}public void setComponentGateway(GatewayComponent componentGateway) {if (componentGateway != null)this.componentGateway = componentGateway;}}
定义具体装饰者角色:
public class LimitDecorator extends AbstractDecorator {public LimitDecorator() {}public LimitDecorator(GatewayComponent componentGateway) {super(componentGateway);}@Overridepublic void service() {// 1.传递日志收集装饰类System.out.println(super.getClass().toString());super.service();System.out.println("第三步>>>>API接口限流");}}public class LogDecorator extends AbstractDecorator {public LogDecorator() {}public LogDecorator(GatewayComponent componentGateway) {super(componentGateway);}@Overridepublic void service() {// 调用装饰类servicesuper.service();// 日志收集System.out.println("第二步>>>>日志的采集.....");}}
如何调用:
public class FactoryGateway {// public static GatewayComponent getGatewayComponent() {// // 1.创建日志装饰类// LogDecorator logDecorator = new LogDecorator();// LimitDecorator limitDecorator = new LimitDecorator();// limitDecorator.setGatewayComponent(logDecorator);// // 2.创建被装饰实现类// BasicComponentGateway basicComponentGateway = new BasicComponentGateway();// logDecorator.setGatewayComponent(basicComponentGateway);// return limitDecorator;// }public static GatewayComponent getGatewayComponent() {return new LimitDecorator(new LogDecorator(new BasicComponentGateway()));}public static void main(String[] args) {GatewayComponent gatewayComponent = FactoryGateway.getGatewayComponent();gatewayComponent.service();}}
