一 概述
1.什么是装饰者模式?
在不修改类,不使用继承的前提下,用一个对象来装饰另一个对象,以扩展目标对象的功能。

2.装饰者模式的作用:
继承也可以扩展类的功能,装饰者模式比继承更加灵活,因为继承时子类受父类的约束,比如子类方法不能降低访问权限,返回值必须是父类方法返回值的子类,而装饰模式就不受这些约束,比较灵活。

二 基本装饰者模式
结构:

  • 父类:可以是接口、抽象类、一般类,保证能够以操作目标对象的方式操作装饰者,即保证装饰者拥有与目标对象相同的方法结构。
  • 目标类;
  • 装饰者类:其中包含目标对象引用,往往通过构造器注入。

三 高级装饰者模式
1.不仅可以对目标对象进行多种形式的增强,而且可以构建装饰者链将多种增强形式同时施加到目标对象上。

2.结构

  • 父类。
  • 目标类:实现或者继承了父类。
  • 装饰者基类:实现或继承了父类,只是实现了目标对象方法,并未增强,作为后续增强的基础。
  • 具体装饰者A类:继承了装饰者基类,对目标类进行一种形式的增强。
  • 具体装饰者B类:继承了装饰者基类,对目标类进行一种形式的增强。

3.按照功能模块化原则,一个模块只负责单一的功能,每一种具体装饰者类,只负责实现一种增强形式。
4.具体装饰者类对目标类的增强建立在基类处理结果的基础上,因此在代码中通过先super获取基类的结果,然后再进行增强。

5.构建装饰者链
⑴基本原理:

首先将目标对象传入一个具体装饰者对象中,再将该具体装饰者对象传入下一个具体装饰者对象中,以此推进,形成一个装饰者链,对目标对象逐级增强。
⑵构建关键:

在具体装饰者类中通过super获取基类处理结果,将基类作为中间环节构建装饰者链。

⑶实现Demo

接口

package com.designmode.decorator.senior;public interface ISomeService {String doSome();}

目标类

package com.designmode.decorator.senior;public class SomeServiceImpl implements ISomeService {@Overridepublic String doSome() {return "   abc   ";}}

装饰者基类

package com.designmode.decorator.senior;public class SomeServiceWrapper implements ISomeService {private ISomeService target;public SomeServiceWrapper(ISomeService target) {super();this.target = target;}@Overridepublic String doSome() {return target.doSome();}}

具体装饰者A类

package com.designmode.decorator.senior;public class TrimDecorator extends SomeServiceWrapper {public TrimDecorator(ISomeService target) {super(target);// TODO Auto-generated constructor stub
    }@Overridepublic String doSome() {// TODO Auto-generated method stubreturn super.doSome().trim();}}

具体装饰者B类

package com.designmode.decorator.senior;public class UpperDecorator extends SomeServiceWrapper {public UpperDecorator(ISomeService target) {super(target);// TODO Auto-generated constructor stub
    }@Overridepublic String doSome() {// TODO Auto-generated method stubreturn super.doSome().toUpperCase();}}

测试类

package com.designmode.decorator.senior;import org.junit.Test;public class DecoratorTest {/*** 装饰者基类,原样实现了目标对象的方法,并未增强*/@Testpublic void test01() {ISomeService target = new SomeServiceImpl();ISomeService decorator = new SomeServiceWrapper(target);String result = decorator.doSome();System.out.println("result=" + result);}/*** 一次增强,对装饰者基类增强*/@Testpublic void test02() {ISomeService target = new SomeServiceImpl();ISomeService decorator = new TrimDecorator(target);String result = decorator.doSome();System.out.println("result=" + result);}/*** 形成装饰者链,逐级增强*/@Testpublic void test03() {ISomeService target = new SomeServiceImpl();ISomeService trimDecorator = new TrimDecorator(target);// 一级增强ISomeService service = new UpperDecorator(trimDecorator);// 二级增强String result = service.doSome();System.out.println("result=" + result);}}

三 常见装饰者应用
IO流中广泛使用装饰者模式,一些类正是装饰了基本输入输出流创建的,如XMLWriter\DateOutputStream\BufferedInputstream\

ObjectInputstream等。

四 与静态代理模式对比
1.相同点:

  • 都与目标类实现共同的接口。
  • 都可以动态地扩展目标类的功能。
  • 都需要在自身类中包含目标对象。

2.不同点
⑴设计目的不同:

  • 装饰者模式是为了增强目标类的功能。
  • 静态代理是为了隐藏与保护目标类。

⑵包含目标对象的方式不同:

  • 在装饰者模式中,目标对象由用户创建,通过构造器传入装饰者中,目标对用户可见。
  • 在静态代理模式中,目标对象在装饰者类的无参构造方法中创建,对用户不可见。

注:静态代理模式请参考http://www.cnblogs.com/tonghun/p/6925614.html

转载于:https://www.cnblogs.com/tonghun/p/6925547.html

设计模式之二装饰者模式相关推荐

  1. 软件设计模式之(二)装饰者模式

    转载自 :  http://blog.csdn.net/chenyujing1234 例子代码:(编译工具:Eclipse) http://www.rayfile.com/zh-cn/files/12 ...

  2. 从王者荣耀看设计模式(七.装饰者模式)

    ##从王者荣耀看设计模式(装饰者模式) 一.简介 王者荣耀中,角色的"伤害值"和"生命值"是很重要的概念.为了保证游戏的胜利,玩家会通过在游戏开始前配置合适的游 ...

  3. 设计模式学习笔记——装饰(Decorator)模式

    设计模式学习笔记--装饰(Decorator)模式 @(设计模式)[设计模式, 装饰模式, decorator] 设计模式学习笔记装饰Decorator模式 基本介绍 装饰案例 类图 实现代码 Dis ...

  4. 设计模式十二之组合模式

    设计模式十二之组合模式 1. 模式的定义与特点 1.1 模式的定义 1.2 模式的特点 1.3 模式的使用场景 2. 模式的结构与实现 2.1 模式的结构 2.2 模式的实现 3. 模式在开源软件中的 ...

  5. 设计模式之【装饰器模式】

    和表妹去喝奶茶 表妹:哥啊,我想喝奶茶. 我:走啊,去哪里喝? 表妹:走,我带你去,我经常去的那家,不但好喝,还可以自由搭配很多小料.我每次都是不同的搭配,换着喝,嘻嘻. 我:你倒是挺会喝的嘛~ 你看 ...

  6. IOS设计模式之二(门面模式,装饰器模式)

    本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...

  7. 《设计模式》之装饰器模式

    一.什么是装饰器模式 当需要对类的功能进行拓展时,一般可以使用继承,但如果需要拓展的功能种类很繁多,那势必会生成很多子类,增加系统的复杂性,并且使用继承实现功能拓展时,我们必须能够预见这些拓展功能,也 ...

  8. 设计模式之【装饰者模式】,实现“穿衣打扮”自由原来这么简单

    文章目录 一.什么是装饰者模式 1.装饰者模式原理 2.装饰者模式四大角色 3.代理.桥接.装饰器.适配器 4 种设计模式的区别 4.装饰者模式的应用场景 5.装饰者模式和代理模式的对比 6.装饰者模 ...

  9. 设计模式 - 结构型 - 装饰者模式

    2019独角兽企业重金招聘Python工程师标准>>> 介绍 意图:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比继承更为灵活. 主要解决:一般的,我们为了扩展一 ...

最新文章

  1. 一生受益的三个小故事
  2. 关于Advanced Installer 11.0打包软件过程一些记录
  3. 图解VS2010打包全过程
  4. HTML5地区自转代码
  5. scikit-learn学习笔记(四)Ridge Regression ( 岭回归 )
  6. php错误拦截机制,php拦截异常怎么写-PHP问题
  7. 原神抽卡记录分析工具源码全开源
  8. arcgis不闭合线转面_地理工具学习--arcgis篇(15):CAD和SHP的简单转换
  9. ML/DL-复习笔记【九】- 神经网络中各层的计算量与参数量
  10. windows系统下搭建私有nuget仓储服务器, 打包程序集并推送到私有nuget仓储服务器...
  11. PMP试题 | 每日一练,快速提分 9.9
  12. SpringBoot-短信发送
  13. 项目实训--Unity多人游戏开发(八、3D音效融合AudioMixer、统一的音频播放系统)
  14. Proteus仿真-步进电机
  15. Android获取手机序列号
  16. byval 和byref的区别,今天刚明白。
  17. Mongodb 设置账号密码
  18. 《认知天性》让学习轻而易举的心理学规律
  19. SAP供应商 供货方和开票方不一致的强控
  20. android 获取当前位置

热门文章

  1. ssm+maven+eclipse框架搭建
  2. Django-2- 模板路径查找,模板变量,模板过滤器,静态文件引用
  3. tensorflow的基础
  4. LeetCode:砖墙【554】
  5. BZOJ5300 [Cqoi2018]九连环 【数学】【FFT】
  6. 单个雪碧图多个图像资源你该如何解决它们的定位?
  7. 【浏览器】浏览器模式与文档模式区别
  8. PHP将Excel另存为html页面
  9. 用ASP.NET编写一个在线RSS新闻聚合器
  10. Hyperledger Fabric学习笔记(三)- 启动网络并测试一个Fabcar的demo