场景
装饰者模式(Decorator Pattern)
是指在不改变原有对象的基础上,将功能附加到对象上,提供了比继承更有弹性的方案。
适用场景:
1、扩展一个类的功能或给一个类添加职责。
2、动态给一个对象添加功能,这些功能可以再动态地撤销。
3、生活中的应用比如给房子装修、给煎饼果子加肠、给蛋糕加巧克力。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
装饰者模式示例-购买电脑加装内存条和硬盘
创建一个电脑类
package com.ruoyi.demo.designPattern.decoratorPattern; public class Computer { protected String getMsg(){ return "电脑"; } public int getPrice(){ return 5000; } }
然后创建一个加内存条的电脑类
package com.ruoyi.demo.designPattern.decoratorPattern; public class ComputerWithMemory extends Computer{ @Override protected String getMsg() { return super.getMsg()+"一个内存条"; } @Override public int getPrice() { return super.getPrice()+1000; } }
再创建一个既加内存条又加硬盘的电脑类
package com.ruoyi.demo.designPattern.decoratorPattern; public class ComputerWithMemoryAndDisk extends ComputerWithMemory{ @Override protected String getMsg() { return super.getMsg()+"一个硬盘"; } @Override public int getPrice() { return super.getPrice()+500; } }
编写客户端测试代码
package com.ruoyi.demo.designPattern.decoratorPattern; public class ComputerTest { public static void main(String[] args) { Computer computer = new Computer(); System.out.println(computer.getMsg()+",总价格:"+computer.getPrice()); ComputerWithMemory computerWithMemory = new ComputerWithMemory(); System.out.println(computerWithMemory.getMsg()+",总价格:"+computerWithMemory.getPrice()); ComputerWithMemoryAndDisk computerWithMemoryAndDisk = new ComputerWithMemoryAndDisk(); System.out.println(computerWithMemoryAndDisk.getMsg()+",总价格:"+computerWithMemoryAndDisk.getPrice()); } }
但是如果用户需要一个加两个内存条、加一个硬盘的电脑,用现在的类是创建不出来的,
也无法自动计算出价格,但是也不能一直通过做定制类来解决。
下面通过装饰者模式来解决
创建一个电脑的抽象类
package com.ruoyi.demo.designPattern.decoratorPattern; public abstract class AbstarctComputer { protected abstract String getMsg(); protected abstract int getPrice(); }
然后创建一个基本电脑套餐类
package com.ruoyi.demo.designPattern.decoratorPattern; public class BaseComputer extends AbstarctComputer{ @Override protected String getMsg() { return "电脑"; } @Override protected int getPrice() { return 5000; } }
再创建一个扩展套餐的抽象装饰者类
package com.ruoyi.demo.designPattern.decoratorPattern; public abstract class ComputerDecotator extends AbstarctComputer{ //静态代理,委派 private AbstarctComputer computer; public ComputerDecotator(AbstarctComputer computer){ this.computer = computer; } protected abstract void doSomething(); @Override protected String getMsg() { return this.computer.getMsg(); } @Override public int getPrice() { return this.computer.getPrice(); } }
然后创建内存条装饰者类
package com.ruoyi.demo.designPattern.decoratorPattern; public class MemoryDecorator extends ComputerDecotator{ public MemoryDecorator(AbstarctComputer computer) { super(computer); } @Override protected void doSomething() { } @Override protected String getMsg() { return super.getMsg()+"+1个内存条"; } @Override public int getPrice() { return super.getPrice()+1000; } }
再创建硬盘装饰者类
package com.ruoyi.demo.designPattern.decoratorPattern; public class DiskDecorator extends ComputerDecotator{ public DiskDecorator(AbstarctComputer computer) { super(computer); } @Override protected void doSomething() { } @Override protected String getMsg() { return super.getMsg()+"+1个硬盘"; } @Override public int getPrice() { return super.getPrice()+500; } }
客户端测试代码
package com.ruoyi.demo.designPattern.decoratorPattern; public class ComputerDecoratorTest { public static void main(String[] args) { AbstarctComputer computer; //要买1台电脑 computer = new BaseComputer(); //加一个内存条 computer = new MemoryDecorator(computer); //加一个硬盘 computer = new DiskDecorator(computer); //再加一个内存条 computer = new MemoryDecorator(computer); System.out.println(computer.getMsg()+",总价:"+computer.getPrice()); } }
装饰者模式的优缺点
优点:
1、装饰者模式是继承的有力补充,且比继承灵活,可以在不改变原有对象的情况下动态地给
一个对象扩展功能,即插即用。
2、使用不同的装饰类及这些装饰类的排列组合,可以实现不同的效果。
3、装饰者模式完全符合开闭原则。
缺点:
1、会出现更多的代码、更多的类,增加程序的复杂性。
2、动态装饰时,多层装饰会更复杂。
原文地址:http://www.cnblogs.com/badaoliumangqizhi/p/16850962.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性