个人做商贸网站,wordpress本地数据库密码忘记,一个小网站一般多少钱,烟台城乡建设学校网站装饰模式详细讲解 一、定义二、装饰模式结构核心思想模式角色模式的UML类图应用场景模式优点模式缺点 实例演示图示代码演示运行结果 一、定义
装饰模式#xff08;别名#xff1a;包装器#xff09; 装饰模式#xff08;Decorator Pattern#xff09;是结构型的设计模式… 装饰模式详细讲解 一、定义二、装饰模式结构核心思想模式角色模式的UML类图应用场景模式优点模式缺点 实例演示图示代码演示运行结果 一、定义
装饰模式别名包装器 装饰模式Decorator Pattern是结构型的设计模式它允许在运行时动态地向对象添加新的职责或功能同时保持对象的原始类不变。通过使用装饰器模式可以在不修改现有代码的基础上扩展对象的功能
二、装饰模式结构
核心思想
1.动态扩展在不改变原类结构和继承关系的情况下动态地为对象添加功能。 2.包装对象通过创建一个包装对象装饰器来包裹真实对象增加额外功能。 3.接口一致性装饰器与真实对象有相同的接口确保客户端能以相同的方式与两者交互。 4.开闭原则对扩展开放对修改关闭。新的功能通过添加装饰器实现而不是修改原类。 5.灵活组合允许通过组合多个装饰器来创建功能更为丰富的对象
模式角色
1.抽象组件Component定义一个接口用于规范准备接收附加责任的对象即被装饰对象。 2.具体组件ConcreteComponent实现抽象组件接口是装饰器要装饰的真实对象。 3.装饰器Decorator持有一个抽象组件的引用并继承抽象组件的接口。它既可以使用所持有的引用调用被装饰的组件的方法也可以增加新的功能。 4.具体装饰器ConcreteDecorator实现装饰器接口并给具体组件添加职责。它通常包含对具体组件的引用以及一个或多个用于增加功能的额外方法。 这些角色在装饰模式中的交互方式是
抽象组件定义了所有装饰器对象和被装饰对象需要实现的接口。具体组件实现了抽象组件接口是准备被装饰的对象。装饰器持有一个对抽象组件的引用并且实现了抽象组件接口。它可以使用这个引用来调用被装饰对象的方法并在调用前后添加新的功能。具体装饰器实现了装饰器接口并且给具体组件添加新的职责。它通常包含一个指向被装饰对象的引用以及用于实现附加功能的代码。
模式的UML类图 应用场景
当需要为单个对象提供多种不同的行为或者表现形式时。需要向一个已经存在的类中添加功能但又不希望修改该类的源代码或继承其子类时组合对象当需要组合多个对象来创建一个具有更多功能的对象时装饰模式是一个很好的选择。通过递归组合方式可以构建出一个具有多种功能的对象。例如在文件系统中文件夹可以被视为一个特殊的文件它可以包含其他文件和文件夹。使用装饰模式可以将文件夹装饰为一个包含额外功能的对象如支持加密、压缩等
模式优点
动态地给对象添加功能相比生成子类更加灵活、透明。无需修改原有类就可以扩展功能符合开闭原则。装饰器可以被组合以便在运行时动态地、多次地添加多个职责。
模式缺点
这种比继承更加灵活机动的特性也同时意味着更加多的复杂性。装饰模式会导致设计中出现许多小类如果过度使用会使程序变得很复杂。不易调试由于装饰器模式涉及到多个对象的交互调试可能会变得相对困难。特别是当装饰器链很长时追踪请求和响应的路径可能会变得复杂。
实例演示
图示
鸡腿堡应用
代码演示
package ZhuangShiMoShi;public abstract class Humburger {protected String name;public String getName() {return name;}public abstract double getPrice();}package ZhuangShiMoShi;public class ChickenBurger extends Humburger {public ChickenBurger(){name鸡腿堡;}public double getPrice(){return 10;}}package ZhuangShiMoShi;public abstract class Condiment extends Humburger {protected Humburger humburger;public abstract String getName();}package ZhuangShiMoShi;public class Chilli extends Condiment {public Humburger hum;public Chilli(Humburger hum) {this.hum hum;}Overridepublic String getName() {// TODO Auto-generated method stubreturn hum.getName() 加辣椒;}Overridepublic double getPrice() {// TODO Auto-generated method stubreturn hum.getPrice();}}package ZhuangShiMoShi;public class Lettuce extends Condiment {public Humburger hum;public Lettuce(Humburger hum) {this.hum hum;}Overridepublic String getName() {// TODO Auto-generated method stubreturn hum.getName() 加生菜;}Overridepublic double getPrice() {// TODO Auto-generated method stubreturn hum.getPrice()1.5;}}
测试类
package ZhuangShiMoShi;public class Test {public static void main(String[] args) {Humburger hum new ChickenBurger();System.out.println(hum.getName() 价钱: hum.getPrice());Lettuce lettucenew Lettuce(hum);System.out.println(lettuce.getName() 价钱:lettuce.getPrice());Chilli chilli1new Chilli(hum);System.out.println(chilli1.getName() 价钱:chilli1.getPrice());Chilli chilli2new Chilli(lettuce);System.out.println(chilli2.getName() 价钱:chilli2.getPrice());}}
运行结果 该代码主体是鸡腿堡可以选择通过添加生菜、酱、辣椒等等许多其他的配料并根据选择的配料计算相应的价格。 博主用心写读者点关注互动传真情知识不迷路