在Java编程语言中,嵌套了非常多设计模式的思想,比如IO流中的缓冲流就使用到以下要介绍的装饰者设计模式。

演示样例代码:

  1. * 抽象构件角色:定义一个抽象接口,来规范准备附加功能的类
  2. * @author Admin
  3. *
  4. */
  5. public interface Drink { //被装饰者的基类
  6. public String description();
  7. public int price();
  8. }

  1. /**
  2. * 详细构件角色:将要被附加功能的类,实现抽象构件角色接口
  3. * @author Admin
  4. *
  5. */
  6. public class SoyaBeanMilk implements Drink{ //被装饰者的详细类
  7.  
  8. public String description() {
  9. return "豆浆";
  10. }
  11.  
  12. public int price() {
  13. return 2;
  14. }
  15.  
  16. }
  1. /**
  2. * 抽象装饰者角色:持有对详细构件角色的引用(被装饰者)并实现抽象构件角色一致的接口
  3. * @author Admin
  4. *
  5. */
  6. public class Decorator implements Drink{ //装饰者的基类
  7. private Drink drink;
  8. public Decorator(Drink drink) {
  9. this.drink = drink;
  10. }
  11.  
  12. public String description() {
  13. return drink.description();
  14. }
  15.  
  16. public int price() {
  17. return drink.price();
  18. }
  19. }

  1. /**
  2. * 详细装饰角色:实现抽象装饰者角色。负责为详细构件加入额外功能.
  3. * @author Admin
  4. *
  5. */
  6. public class Sugar extends Decorator{ //装饰者详细类
  7. public Sugar(Drink drink) {
  8. super(drink);
  9. }
  10. public String description() {
  11. return super.description()+" 糖";
  12. }
  13. public int price() {
  14. return super.price()+1;
  15. }
  16. }
  17.  
  18. /**
  19. * 详细装饰角色:实现抽象装饰者角色,负责为详细构件加入额外功能.
  20. * @author Admin
  21. *
  22. */
  23. public class BlackBean extends Decorator{
  24. public BlackBean(Drink drink) {
  25. super(drink);
  26. }
  27. public String description() {
  28. return super.description()+" 黑豆";
  29. }
  30. public int price() {
  31. return super.price()+3;
  32. }
  33.  
  34. }
  1. /**
  2. * 測试类(測试装饰者模式)
  3. * @author Admin
  4. *
  5. */
  6. public class Test {
  7.  
  8. public static void main(String[] args) {
  9. Drink drink = new SoyaBeanMilk(); //被装饰者(豆浆)
  10. System.out.println(drink.description()+"花费:"+drink.price());
  11. Drink drink1 = new Sugar(drink); //糖是装饰者类。用来装饰豆浆
  12. System.out.println(drink1.description()+"花费:"+drink1.price());
  13. Drink drink2 = new BlackBean(drink); //用黑豆来装饰豆浆
  14. System.out.println(drink2.description()+"花费:"+drink2.price());
  15. Drink drink3 = new BlackBean(drink1); //用黑豆来装饰糖豆浆
  16. System.out.println(drink3.description()+"花费:"+drink3.price());
  17. }
  18.  
  19. }

实验结果:

Java 设计模式—装饰者模式的更多相关文章

  1. Java设计模式——装饰者模式

    JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...

  2. JAVA设计模式--装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...

  3. 从源码角度理解Java设计模式——装饰者模式

    一.饰器者模式介绍 装饰者模式定义:在不改变原有对象的基础上附加功能,相比生成子类更灵活. 适用场景:动态的给一个对象添加或者撤销功能. 优点:可以不改变原有对象的情况下动态扩展功能,可以使扩展的多个 ...

  4. 【设计模式】Java设计模式 - 装饰者模式

    Java设计模式 - 装饰者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自 ...

  5. JAVA 设计模式 装饰者模式

    用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式. 结构

  6. Java设计模式の装饰者模式

    目录 一.问题引入 二.设计原则 三.用装饰者模式解决问题 四.装饰者模式的特点 五.装饰者模式的定义 六.装饰者模式的实现 七.java.io包内的装饰者模式 一.问题引入 咖啡店的类设计: 一个饮 ...

  7. Java设计模式--装饰器模式到Java IO 流

    装饰器模式 抽象构件角色:给出一个抽象接口,以规范准备接受附加责任的对象. 具体构件角色:定义准备接受附加责任的对象. 抽象装饰角色:持有一个构件对象的实例,并对应一个与抽象构件接口一致的接口. 具体 ...

  8. JAVA设计模式---装饰者模式

    写在前面的话: 该模式动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案.装饰者可以在被装饰者的行为前面与/或后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特定的 ...

  9. 设计模式-装饰者模式(Decorator Pattern)

    本文由@呆代待殆原创,转载请注明出处. 此设计模式遵循的设计原则之一:类应该支持扩展,而拒绝修改(Open-Closed Principle) 装饰者模式简述 装饰者模式通过组合的方式扩展对象的特性, ...

随机推荐

  1. 使用Java生成word文档(附源码)

    当我们使用Java生成word文档时,通常首先会想到iText和POI,这是因为我们习惯了使用这两种方法操作Excel,自然而然的也想使用这种生成word文档.但是当我们需要动态生成word时,通常不 ...

  2. Django总结二

    - 创建app应用与ORM操作 - Django项目project - app(应用) -> 不同的功能放在不同的app中 - 命令 : - 创建app python manage.py sta ...

  3. IOS开发之Swift学习笔记

    1.因为存储属性要求初始化,我们可以使用lazy修饰符来延迟初始化.

  4. 去除IOS苹果手机自带按钮样式的问题~

    input[type="button"], input[type="submit"], input[type="reset"] { -web ...

  5. 在PHP中调用php_ssh实现远程登陆linux服务器并执行shell脚本。

    这个功能主要用于在web端利用程序对远程服务器进行操作,通过PHP_ssh执行shell脚本来实现. 首先要安装php_ssh2组件,linux中centos7下有ssh2源,直接安装.window下 ...

  6. linu下nginx的安装

    这里用到的环境是nginx-1.8.0,linux用的是CentOS-7-x86_64-DVD-1804.iso版本 1   什么是nginx Nginx ("engine x") ...

  7. gitlab分享项目到其它组

    1. 找到以下页面(管理员权限),随便点入一个项目 2. 点击edit编辑 3.点击members 4. 查看是否分享成功

  8. Nginx配置文件的高亮显示设置

    linux系统下vim或者vi编辑器默认是没有对nginx的语法高亮设置. 1.下载vi语法高亮配置到 ~/.vim/syntax,如果不存在则创建该目录,cd ~/.vim/syntax wget ...

  9. PHP websocket之聊天室实现

    PHP部分 <?php error_reporting(E_ALL); set_time_limit(0);// 设置超时时间为无限,防止超时 date_default_timezone_set ...

  10. Python面向对象----继承, 重载

    1. 面向对象三大特性之继承. 继承的便捷是子类可以直接调用父类里面的方法和属性.(在强类型语言里面是只能调用公有成员), 不用重复的造轮子. 减少程序猿的负担.实现多态等上层结构 2. 父类代码 3 ...