设计模式之二装饰者模式
一 概述
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
设计模式之二装饰者模式相关推荐
- 软件设计模式之(二)装饰者模式
转载自 : http://blog.csdn.net/chenyujing1234 例子代码:(编译工具:Eclipse) http://www.rayfile.com/zh-cn/files/12 ...
- 从王者荣耀看设计模式(七.装饰者模式)
##从王者荣耀看设计模式(装饰者模式) 一.简介 王者荣耀中,角色的"伤害值"和"生命值"是很重要的概念.为了保证游戏的胜利,玩家会通过在游戏开始前配置合适的游 ...
- 设计模式学习笔记——装饰(Decorator)模式
设计模式学习笔记--装饰(Decorator)模式 @(设计模式)[设计模式, 装饰模式, decorator] 设计模式学习笔记装饰Decorator模式 基本介绍 装饰案例 类图 实现代码 Dis ...
- 设计模式十二之组合模式
设计模式十二之组合模式 1. 模式的定义与特点 1.1 模式的定义 1.2 模式的特点 1.3 模式的使用场景 2. 模式的结构与实现 2.1 模式的结构 2.2 模式的实现 3. 模式在开源软件中的 ...
- 设计模式之【装饰器模式】
和表妹去喝奶茶 表妹:哥啊,我想喝奶茶. 我:走啊,去哪里喝? 表妹:走,我带你去,我经常去的那家,不但好喝,还可以自由搭配很多小料.我每次都是不同的搭配,换着喝,嘻嘻. 我:你倒是挺会喝的嘛~ 你看 ...
- IOS设计模式之二(门面模式,装饰器模式)
本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...
- 《设计模式》之装饰器模式
一.什么是装饰器模式 当需要对类的功能进行拓展时,一般可以使用继承,但如果需要拓展的功能种类很繁多,那势必会生成很多子类,增加系统的复杂性,并且使用继承实现功能拓展时,我们必须能够预见这些拓展功能,也 ...
- 设计模式之【装饰者模式】,实现“穿衣打扮”自由原来这么简单
文章目录 一.什么是装饰者模式 1.装饰者模式原理 2.装饰者模式四大角色 3.代理.桥接.装饰器.适配器 4 种设计模式的区别 4.装饰者模式的应用场景 5.装饰者模式和代理模式的对比 6.装饰者模 ...
- 设计模式 - 结构型 - 装饰者模式
2019独角兽企业重金招聘Python工程师标准>>> 介绍 意图:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比继承更为灵活. 主要解决:一般的,我们为了扩展一 ...
最新文章
- 一生受益的三个小故事
- 关于Advanced Installer 11.0打包软件过程一些记录
- 图解VS2010打包全过程
- HTML5地区自转代码
- scikit-learn学习笔记(四)Ridge Regression ( 岭回归 )
- php错误拦截机制,php拦截异常怎么写-PHP问题
- 原神抽卡记录分析工具源码全开源
- arcgis不闭合线转面_地理工具学习--arcgis篇(15):CAD和SHP的简单转换
- ML/DL-复习笔记【九】- 神经网络中各层的计算量与参数量
- windows系统下搭建私有nuget仓储服务器, 打包程序集并推送到私有nuget仓储服务器...
- PMP试题 | 每日一练,快速提分 9.9
- SpringBoot-短信发送
- 项目实训--Unity多人游戏开发(八、3D音效融合AudioMixer、统一的音频播放系统)
- Proteus仿真-步进电机
- Android获取手机序列号
- byval 和byref的区别,今天刚明白。
- Mongodb 设置账号密码
- 《认知天性》让学习轻而易举的心理学规律
- SAP供应商 供货方和开票方不一致的强控
- android 获取当前位置