装饰者模式:

动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更加有弹性的替代方案。
装饰者核心:实现功能组合

继承与组合区别:

继承
继承是给一个类添加行为的比较有效的途径。通过使用继承,可以使得子类在拥有自身方法的同时,还可以拥有父类的方法。但是使用继承是静态的,在编译的时候就已经决定了子类的行为,我们不便于控制增加行为的方式和时机。

组合
组合即将一个对象嵌入到另一个对象中,由另一个对象来决定是否引用该对象来扩展自己的行为。这是一种动态的方式,我们可以在应用程序中动态的控制。

与继承相比,组合关系的优势就在于不会破坏类的封装性,且具有较好的松耦合性,可以使系统更加容易维护。但是它的缺点就在于要创建比继承更多的对象。

装饰者模式优点

一句话:在原有的基础上 ,增加功能 ,提高效率

1、装饰者模式可以提供比继承更多的灵活性

2、可以通过一种动态的方式来扩展一个对象的功能,在运行时选择不同的装饰器,从而实现不同的行为。

3、通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。可以使用多个具体装饰类来装饰同一对象,得到功能更为强大的对象。

4、具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,在使用时再对其进行组合,原有代码无须改变,符合“开闭原则”。

装饰者模式缺点

一句话:繁琐

1、会产生很多的小对象,增加了系统的复杂性

2、这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错,排错也很困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐。

装饰者应用场景

1、在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

2、需要动态地给一个对象增加功能,这些功能也可以动态地被撤销。 当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。

个人理解:
装饰者模式是指在继承父类后,重写父类方法时,不改变父类中该方法的原有功能,只是在该功能基础上添加自己想要扩充的功能。

一句话:父类原有功能不变,子类再添加其他功能

简单实例:

父类

package 设计模式之装饰者模式;public class Father {public void run(){System.out.println("跑步...");}
}

子类:
在子类中重写run方法时,不改变父类的原有功能,并根据需要添加自己的功能。这里的装饰并不复杂,不存在多层装饰,所以在子类中创建一个父类属性是多余的,但在多层装饰中,这是必要的。

package 设计模式之装饰者模式;public class Son extends Father {Father father;public Son(Father father) {super();this.father = father;}@Overridepublic void run() {System.out.println("欣赏周围的美景...");father.run();System.out.println("听歌...");}
}

测试类:

package 设计模式之装饰者模式;public class Test {public static void main(String[] args){Father father=new Father();father.run();System.out.println("son:");Son son = new Son(father);son.run();}
}

结果:

多层装饰实例

借鉴实例,来自http://www.cnblogs.com/xinye/p/3910149.html
逻辑分析图:

1.装饰者基类(被操作的对象)

package com.xinye.test.decoration;
/*** 食物基类* @author xinye**/
public abstract class Food {protected String desc;public abstract String getDesc();
}

2.被操作对象具体类

鸡肉

package com.xinye.test.decoration;
/*** 鸡肉* @author xinye**/
public class Chicken extends Food {public Chicken(){desc = "鸡肉";}@Overridepublic String getDesc() {return desc;}}

鸭肉

package com.xinye.test.decoration;
/*** 鸭肉* @author xinye**/
public class Duck extends Food {public Duck(){desc = "鸭肉";}@Overridepublic String getDesc() {return desc;}}

3.装饰者基类(操作类,对对象实现什么操作)

package com.xinye.test.decoration;
/*** * @author xinye**/
public abstract class FoodDecoration extends Food {@Overridepublic abstract String getDesc();}

4.具体操作类

蒸-装饰者

package com.xinye.test.decoration;
/*** 蒸食物* @author xinye**/
public class SteamedFood extends FoodDecoration {private Food food;public SteamedFood(Food f){this.food = f;}@Overridepublic String getDesc() {return getDecoration() + food.getDesc();}private String getDecoration(){return "蒸";}
}

烤-装饰者

package com.xinye.test.decoration;
/*** 烤食物* @author xinye**/
public class RoastFood extends FoodDecoration {private Food food;public RoastFood(Food f){this.food = f;}@Overridepublic String getDesc() {return getDecoration() + food.getDesc();}private String getDecoration(){return "烤";}
}

5.测试类(客户端)

package com.xinye.test.decoration;
/*** 客户端* @author xinye**/
public class Client {public static void main(String[] args) {// 测试单纯的食物Food f1 = new Chicken();System.out.println(f1.getDesc());System.out.println("----------------------");// 测试单重修饰的食物RoastFood rf = new RoastFood(f1);System.out.println(rf.getDesc());System.out.println("----------------------");// 测试多重修饰的食物SteamedFood sf = new SteamedFood(rf);System.out.println(sf.getDesc());}
}

执行结果:

鸡肉
烤鸡肉
蒸烤鸡肉

转载于:https://www.cnblogs.com/TCB-Java/p/6770127.html

Java中设计模式之装饰者模式-3相关推荐

  1. java外观设计修改_Java设计模式之外观模式和装饰器模式的设计(精选)

    前言 本篇来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接 ...

  2. Java设计模式12:装饰器模式

    装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...

  3. 图解Java设计模式学习笔记——结构型模式(适配器模式、桥接模式、装饰者模式、组合模式、外观模式、享元模式、代理模式)

    一.适配器模式(类适配器.对象适配器.接口适配器) 1.现实生活中的例子 泰国插座用的是两孔的(欧标),可以买个多功能转换插头(适配器),这样就可以使用了国内的电器了. 2.基本介绍 适配器模式(Ad ...

  4. Java设计模式之《装饰器模式》及应用场景

    一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是单方,和代理模式相同,而且目标必须是抽象的. 而实际上,装饰器模式和代理模式 ...

  5. Java设计模式之《装饰器模式》

    一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是单方,和代理模式相同,而且目标必须是抽象的. 而实际上,装饰器模式和代理模式 ...

  6. java模式之装饰器模式

    定义: 装饰器模式也叫作包装器模式,只在不改变原有对象的基础上,动态的给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活,属于结构型设计模式 装饰器模式提供了比继承更有弹性的 ...

  7. Java设计模式之五 ----- 外观模式和装饰器模式

    前言 在上一篇中我们学习了结构型模式的适配器模式和桥接模式.本篇则来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这 ...

  8. 代理模式和装饰者模式

    简介 代理模式和装饰者模式是两种常见的设计模式.代理模式是为其它对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到 ...

  9. 【设计模式】【结构型模式】装饰器模式

    概念 定义 装饰模式指动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包 ...

  10. 设计模式之门面模式与装饰器模式详解和应用

    目录 1 门面模式定义 1.1 门面模式的应用场景 1.2 门面模式的通用写法 1.3 门面模式业务场景实例 1.4 门面模式在源码中的应用 1.5 门面模式的优缺点 2 装饰器模式 2.1 装饰器模 ...

最新文章

  1. 东芝再曝财务造假丑闻 日企百年老店怎么了?
  2. 面试官:为什么mysql不建议执行超过3表以上的多表关联查询?
  3. Python基础08 面向对象的基本概念
  4. springmvc和mybatis面试题
  5. jQuery插件 -- Cookie插件jquery.cookie.js(转)
  6. 尤大是如何发布vuejs的,学完可以应用到项目
  7. 云漫圈 | 写给对 ”游戏开发” 感兴趣的朋友们
  8. SQLAlchemy schema.Table
  9. 20172310 《程序设计与数据结构》实验二报告
  10. LeetCode 49 字母异位词分组
  11. Python使用正则爬取51job
  12. mysql blob类型图片输出到前端
  13. 总纲-信息、网络等级保护测评机构 、名单-等保测评机构目录-等保测评公司推荐目录
  14. 论文|少样本学习综述
  15. SQL Transformation
  16. 怎么卸载虚幻4_专访Epic Games:虚幻引擎5离手游近在咫尺,中小团队也能很快上手...
  17. 《软件工艺》目录—导读
  18. linux下php添加imap模块
  19. asp.net的aspx页面<% %>、<%@ %>、<%# %>、<%= %>、<%$ %>的用法
  20. js实现粘贴板js插件clipboard.js实现一键复制粘贴功能

热门文章

  1. js实现快速排序(in-place)简述
  2. php学习之路:WSDL详细解释(两)
  3. 终端花屏后的恢复办法
  4. Eclipse中最有用的快捷键组合
  5. 细思极恐:网传某软件可一键监控员工是否要“跑路”,争议发生后,监控系统研发商悄悄下架相关服务...
  6. Java程序员必会的工具库,让你的代码量减少90%!
  7. 秒杀系统架构分析与实战(14155字,26图)
  8. 工作10年才懂的道理,早知道职位比现在高两级
  9. ubuntu13.10安装mysql_Ubuntu 10.10 源码安装MySQL 5.1.34
  10. python实现xml文件解析失败_Python实现灵活的xml文件解析