一文带你看懂装饰者模式
装饰者模式
装饰器模式(DecoratorPattern)允许向一个现有的对象添加新的功能,是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀;
主要角色:组件(Component):组件接口定义了全部组件类和装饰器实现的行为;组件实现类(ConcreteComponent):实现Component接口,组件实现类就是被装饰器装饰的原始对象,新功能或者附加功能都是通过装饰器添加到该类的对象上的;装饰器抽象类(Decorator):实现Component接口的抽象类,在其中封装了一个Component对象,也就是被装饰的对象;具体装饰器类(ConcreteDecorator):该实现类要向被装饰的对象添加某些功能;
类图:
看具体的例子,就拿去火锅店吃火锅拌蘸料这个来说。
蘸料有很多:
而每个人的口味又不一样。所以组合就非常多。这种情况下如果使用装饰着模式来实现看看。
第一步
首先我们有一个行为拌蘸料(Component)Author:jimmyDescription:装饰着模式组件(Component):组件接口定义了全部组件类和装饰器实现的行为;publicinterfaceAllocatSeasoning{voidallo();}
接下来,按照上面装饰者的模型进行分析,我们需要2个类来实现上面的行为
第二步
第一个类(ConcreteComponent)可以理解为装拌料的碗,后面的加蘸料都放到这个碗里面Author:jimmyDescription:组件实现类(ConcreteComponent):实现Component接口,组件实现类就是被装饰器装饰的原始对象,新功能或者附加功能都是通过装饰器添加到该类的对象上的;可以把这个理解为装拌料的碗publicclassAllocDoimplementsAllocatSeasoning{Overridepublicvoidallo(){System。out。println(您好,这边是调料自选区,可以按照您的口味选择自己喜欢的口味);}}
第三步
第二个类,这个类可以理解为抽象Author:jimmyDescription:装饰器抽象类(Decorator):实现Component接口的抽象类,在其中封装了一个Component对象,也就是被装饰的对象;这个对象可以理解为已经准备好了,要去拿蘸料的动作的父级。AllocatSeasoning可以理解为蘸料和婉的合体。publicclassAllocDecoratorimplementsAllocatSeasoning{持有对象privateAllocatSeasoningallocatSeasoning;构造器publicAllocDecorator(AllocatSeasoningallocatSeasoning){this。allocatSeasoningallocatSeasoning;}调用对下个对应的方法Overridepublicvoidallo(){allocatSeasoning。allo();}}
第四步
放具体的蘸料(ConcreteDecorator)这里说白了就是拿着放有蘸料的碗(可以是空碗)来放现在想放的蘸料。我这里只给出了一个具体类,其他的有兴趣可以把代码复制,然后补充下。Author:jimmyDescription:具体装饰器类(ConcreteDecorator):该实现类要向被装饰的对象添加某些功能;这里说白了就是拿着放有蘸料的碗(可以是空碗)来放现在想放的蘸料publicclassGarlicAllocextendsAllocDecorator{publicGarlicAlloc(AllocatSeasoningallocatSeasoning){super(allocatSeasoning);}Overridepublicvoidallo(){调用原有业务方法super。allo();补充我们这个行为的方法addGarlic();}publicvoidaddGarlic(){System。out。println(加蒜);}}
测试类publicclassDecoratorClinet{publicstaticvoidmain(String〔〕args){AllocatSeasoninganewOilAlloc(newGarlicAlloc(newChilliAlloc(newAllocDo())));a。allo();}}
运行结果:您好,这边是调料自选区,可以按照您的口味选择自己喜欢的口味
加辣椒
加蒜
加油