设计模式之装饰模式(Decorator)
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)的更多相关文章
- 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern)
原文:乐在其中设计模式(C#) - 装饰模式(Decorator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern) 作者:weba ...
- 二十四种设计模式:装饰模式(Decorator Pattern)
装饰模式(Decorator Pattern) 介绍动态地给一个对象添加一些额外的职责.就扩展功能而言,它比生成子类方式更为灵活.示例有一个Message实体类,某个对象对它的操作有Insert()和 ...
- 设计模式-09装饰模式(Decorator Pattern)
1.模式动机 一般有两种方式可以实现给一个类或对象增加行为: 继承机制:使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是 ...
- 设计模式之装饰模式(Decorator)摘录
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/fengbingchun/article/details/29237955 23种GOF设计模式一般分 ...
- 设计模式 笔记 装饰模式 Decorator
//---------------------------15/04/17---------------------------- //Decorator 装饰模式----对象结构型模式 /* 1:意 ...
- 结构型设计模式之装饰模式(Decorator)
结构 意图 动态地给一个对象添加一些额外的职责.就增加功能来说,D e c o r a t o r 模式相比生成子类更为灵活. 适用性 在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职责. ...
- 设计模式之装饰模式(Decorator)
装饰模式原理:给对象增加特性,这种特性是一种累加的效果 代码如下 #include <iostream> #include <string> #include <list ...
- 【设计模式】—— 装饰模式Decorator
前言:[模式总览]——————————by xingoo 模式意图 在不改变原来类的情况下,进行扩展. 动态的给对象增加一个业务功能,就功能来说,比生成子类更方便. 应用场景 1 在不生成子类的情况下 ...
- Netty学习-IO体系架构系统回顾 & 装饰模式Decorator的具体使用
Netty学习-IO体系架构系统回顾 IO和NIO的学习 NIO - 1.4 开始出的 在网络应用框架中,NIO得到了大量的使用,特别是netty里面 前提:对IO及其了解 对IO的总结和回顾 理解J ...
- 设计模式 装饰模式(Decorator)
设计模式 装饰模式(Decorator) @author ixenos 装饰模式是什么 1.装饰模式以对客户端透明的方式对象的功能,是继承关系的一个替代方案,但装饰模式可以在不创造更多子类的情况下,对 ...
随机推荐
- debug启动项目很慢
用debug启动项目比正常启动慢,从网上找到的是这样说的.删除所有的断点就可以了. 这个问题可能是由于eclipse和tomcat的交互而产生的,在以debug模式启动tomcat时,发生了读取文件错 ...
- linux环境下安装python
在linux系统中安装python解释器 打开官网www.python.org 选择合适的版本进行下载 将下载好的压缩包拖入Xshell中,依次输入一下命令即可 tar xf Python-.tar. ...
- vm中centos7磁盘扩容
在VM虚拟平台管理客户端,将虚拟机关机后,将分配的磁盘大小30G扩至300G.如图. 调整完后,重新打开虚拟机,使用fdisk -l查看,可以看到我们刚刚扩容的空间已经可以看到,但没有分区,还 ...
- Spring property文件配置方法以及如何与工程分离
1,Spring使用property文件作为配置源 工程中难免出现一些需要每次部署都需要配置的参数,如数据源连接参数等,测试环境跟实际运行环境是不一样的. 使用spring框架的话,这些参 ...
- 【记录】metasploit总结
sessions -l 查看会话 backgroud 暂时退出当前会话 注入进程: ps 查看进程migrate 注入进程 进程ID 一般选择explorer.exe对应的PID run vnc 查看 ...
- (转)关于INF为0x3f3f3f3f
转自https://blog.csdn.net/jiange_zh/article/details/50198097 在算法竞赛中,我们常常需要用到一个“无穷大”的值,对于我来说,大多数时间我会根据具 ...
- get 与 post 区别
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP ...
- echarts Y轴数据类型不同怎么让折线图显示差距不大
如果希望在同一grid中展示不同数据类型的折线(1000或10%),那么展现出来的折线肯定显示差距很大,那么怎么让这两条折线显示效果差不多,在之前的项目中碰到了这个问题 每条折线对应的是不同的数据组, ...
- numpy.reshape使用条件
np.array中的元素的个数,需要和转换的类型各个维度的乘积相等.如:\(6=2*3=1*2*3\) 另外,可以发现参数的对应关系为shape(num_dims, num_rows, num_col ...
- enum学习
https://www.cnblogs.com/hyl8218/p/5088287.html