1、 装饰者模式,动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更加有弹性的替代方案。

2、组合和继承的区别

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

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

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

3、装饰者模式的优缺点

优点

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

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

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

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

缺点

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

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

4、装饰者的使用场景

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

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

以上内容来自网络

5、UML图(Astah/jude)下载地址:http://pan.baidu.com/s/1eQiVePc

6、示例:

装饰者基类

 1 package com.xinye.test.decoration;
2 /**
3 * 食物基类
4 * @author xinye
5 *
6 */
7 public abstract class Food {
8
9 protected String desc;
10
11 public abstract String getDesc();
12 }

鸡肉

 1 package com.xinye.test.decoration;
2 /**
3 * 鸡肉
4 * @author xinye
5 *
6 */
7 public class Chicken extends Food {
8 public Chicken(){
9 desc = "鸡肉";
10 }
11 @Override
12 public String getDesc() {
13 return desc;
14 }
15
16 }

鸭肉

 1 package com.xinye.test.decoration;
2 /**
3 * 鸭肉
4 * @author xinye
5 *
6 */
7 public class Duck extends Food {
8 public Duck(){
9 desc = "鸭肉";
10 }
11 @Override
12 public String getDesc() {
13 return desc;
14 }
15
16 }

装饰者基类

 1 package com.xinye.test.decoration;
2 /**
3 *
4 * @author xinye
5 *
6 */
7 public abstract class FoodDecoration extends Food {
8
9 @Override
10 public abstract String getDesc();
11
12 }

蒸-装饰者

 1 package com.xinye.test.decoration;
2 /**
3 * 蒸食物
4 * @author xinye
5 *
6 */
7 public class SteamedFood extends FoodDecoration {
8
9 private Food food;
10
11 public SteamedFood(Food f){
12 this.food = f;
13 }
14
15 @Override
16 public String getDesc() {
17 return getDecoration() + food.getDesc();
18 }
19
20 private String getDecoration(){
21 return "蒸";
22 }
23 }

烤-装饰者

 1 package com.xinye.test.decoration;
2 /**
3 * 烤食物
4 * @author xinye
5 *
6 */
7 public class RoastFood extends FoodDecoration {
8
9 private Food food;
10
11 public RoastFood(Food f){
12 this.food = f;
13 }
14
15 @Override
16 public String getDesc() {
17 return getDecoration() + food.getDesc();
18 }
19
20 private String getDecoration(){
21 return "烤";
22 }
23 }

客户端

 1 package com.xinye.test.decoration;
2 /**
3 * 客户端
4 * @author xinye
5 *
6 */
7 public class Client {
8 public static void main(String[] args) {
9 // 测试单纯的食物
10 Food f1 = new Chicken();
11 System.out.println(f1.getDesc());
12
13 System.out.println("----------------------");
14 // 测试单重修饰的食物
15 RoastFood rf = new RoastFood(f1);
16 System.out.println(rf.getDesc());
17
18 System.out.println("----------------------");
19 // 测试多重修饰的食物
20 SteamedFood sf = new SteamedFood(rf);
21 System.out.println(sf.getDesc());
22 }
23 }

执行结果: 鸡肉 ---------------------- 烤鸡肉 ---------------------- 蒸烤鸡肉

设计模式之装饰模式(Decorator)的更多相关文章

  1. 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern)

    原文:乐在其中设计模式(C#) - 装饰模式(Decorator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern) 作者:weba ...

  2. 二十四种设计模式:装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern) 介绍动态地给一个对象添加一些额外的职责.就扩展功能而言,它比生成子类方式更为灵活.示例有一个Message实体类,某个对象对它的操作有Insert()和 ...

  3. 设计模式-09装饰模式(Decorator Pattern)

    1.模式动机 一般有两种方式可以实现给一个类或对象增加行为: 继承机制:使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是 ...

  4. 设计模式之装饰模式(Decorator)摘录

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/fengbingchun/article/details/29237955 23种GOF设计模式一般分 ...

  5. 设计模式 笔记 装饰模式 Decorator

    //---------------------------15/04/17---------------------------- //Decorator 装饰模式----对象结构型模式 /* 1:意 ...

  6. 结构型设计模式之装饰模式(Decorator)

    结构 意图 动态地给一个对象添加一些额外的职责.就增加功能来说,D e c o r a t o r 模式相比生成子类更为灵活. 适用性 在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职责. ...

  7. 设计模式之装饰模式(Decorator)

    装饰模式原理:给对象增加特性,这种特性是一种累加的效果 代码如下 #include <iostream> #include <string> #include <list ...

  8. 【设计模式】—— 装饰模式Decorator

    前言:[模式总览]——————————by xingoo 模式意图 在不改变原来类的情况下,进行扩展. 动态的给对象增加一个业务功能,就功能来说,比生成子类更方便. 应用场景 1 在不生成子类的情况下 ...

  9. Netty学习-IO体系架构系统回顾 & 装饰模式Decorator的具体使用

    Netty学习-IO体系架构系统回顾 IO和NIO的学习 NIO - 1.4 开始出的 在网络应用框架中,NIO得到了大量的使用,特别是netty里面 前提:对IO及其了解 对IO的总结和回顾 理解J ...

  10. 设计模式 装饰模式(Decorator)

    设计模式 装饰模式(Decorator) @author ixenos 装饰模式是什么 1.装饰模式以对客户端透明的方式对象的功能,是继承关系的一个替代方案,但装饰模式可以在不创造更多子类的情况下,对 ...

随机推荐

  1. LeetCode记录之27——Remove Element

    这道题跟26题很类似,并且有官方的答案.看了官方的答案之后发现写得特别巧,自己做的题太少思路太窄.有意思的是我的算法的时间复杂度是O(N^2),官方的是O(N),我的实际运行时间还少了2ms. ive ...

  2. dedecms 中变量函数

    {dede:global.cfg_cmsurl/} 是网站根目录{dede:global.cfg_cmsurl/} 是当前目录{dede:global.cfg_templets_skin/} 当前模板 ...

  3. [转] CSS 颜色名

    [From] http://www.w3school.com.cn/cssref/css_colornames.asp CSS 颜色名 所有浏览器都支持的颜色名. HTML 和 CSS 颜色规范中定义 ...

  4. Java打包成jar

    若要生成一个名为 cal.jar 的可执行jar文件:(文件名可以是任意合法名字)  (这是我认为简单实用的一种方法,还有很多别的方法在此就不介绍了)  第一 把程序生成的所有字节码文件(即.clas ...

  5. css引入 以及选择器040

    css的介绍: css(Cascading Style Sheet)  层叠样式表 作用就是给HTML页面标签议案家各种样式 定义网页效果 简单来说 就是讲网页内容和显示样式进行分离 , 提高了显示功 ...

  6. PIE SDK最小噪声变换

    1.算法功能简介 最小噪声分离变换是用于判定图像数据内在的维数(即波段数),分离数据中的噪声,减少随后处理中的计算需求量. MNF 本质上是两次层叠的主成分变换.第一次变换(基于估计的噪声协方差矩阵) ...

  7. linux运维配置讲解--sshd-config

    文件配置: 1, /etc/ssh/sshd_config ssh配置文件 2, /etc/shadow 密码文件 3, /etc/sudoers 授权用户管理文件 4, /etc/issue 系统信 ...

  8. 游戏源码--Unity开源Moba游戏-服务器-客户端完整V1.0

    http://www.manew.com/thread-111658-1-1.html

  9. 新建maven工程index.jsp页面报错

    引入servlet依赖jar <dependency><groupId>javax.servlet</groupId><artifactId>servl ...

  10. javascript遍历表

    定义表结构 1. 通过id遍历 <html> <body> <table id="tb" border="1"> <t ...