博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
装饰者模式
阅读量:7143 次
发布时间:2019-06-28

本文共 2312 字,大约阅读时间需要 7 分钟。

装饰者模式是什么

装饰者吗模式,又叫包装者模式(wapper)。常见的装饰者模式有

BufferedReader br = new BufferedReader(InputStreamReader(new InputSteam()));

就是这样一层嵌套一层,这就是典型的装饰者模式。其中

new InputStream() 是被装饰对象
new InputStreamReader() 是内层装饰者
new BufferedReader() 是外层装饰者
为什么要用到装饰者模式
有这么一种情况,在保持核心业务不变的情况下,每添加一层装饰者,就是给它新增一部分功能。

装饰者模式理论

1)        抽象构件角色(Component):定义一个抽象接口,以规范准备接收附加责任的对象。2)        具体构件角色(Concrete Component):这是被装饰者,定义一个将要被装饰增加功能的类。3)        装饰角色(Decorator):持有一个构件对象的实例,并定义了抽象构件定义的接口。4)        具体装饰角色(Concrete Decorator):负责给构件添加增加的功能。

概念相当抽象,简单点说明,就是需要

1)接口2)被装饰者实现该接口3)装饰者继承被装饰者4)达到new BufferedReader(InputStreamReader(new InputSteam()))这种话样式

自己写一个装饰者模式案例,达到控制台输出效果如下

“外层装饰者(内层装饰者(被装饰者))”
1)接口

public interface Wapper {    public String say();}

2)被装饰者实现接口

public class WapperImpl implements Wapper{    @Override    public String say() {        String msg = "被装饰对象";        return msg;    }}

3)装饰者继承被装饰者

内层装饰者

public class InnerDecorator extends WapperImpl{    private Wapper wapper; //支持向上转型,实现被装饰者多样化    public InnerDecorator(Wapper wapper) {        this.wapper = wapper;    }    public String say() {        String msg = "内层装饰者("+wapper.say()+")";        return msg;    }}

外层装饰者

public class OuterDecorator extends WapperImpl{    private Wapper wapper; //向上转型,支持内层装饰者多样化    public OuterDecorator(Wapper wapper) {        this.wapper = wapper;    }    public String say() {         String msg = "外层装饰者("+wapper.say()+")";         return msg;    }}

4) 达到new BufferedReader(InputStreamReader(new InputSteam()))这种话样式

测试类

public class Test {    public static void main(String[]args) {        //实现new OuterDecorator(new InnerDecorator(new Object())),完成输出“外层装饰(内层装饰(被装饰对象))”        OuterDecorator od = new OuterDecorator(new InnerDecorator(new WapperImpl()));        System.out.println(od.say());    }}

运行一下,打印成功!

装饰者模式

Spring中的装饰者模式

HttpServletRequestWrapper就是一个典型的装饰者模式

public class HttpServletRequestWrapper extends ServletRequestWrapper implements HttpServletRequest

可以看见它实现了HttpServletRequest接口

public interface HttpServletRequest extends ServletRequest {...    String getHeader(String name);    String getRemoteUser();    String getRequestedSessionId();    String getRequestURI();    StringBuffer getRequestURL();...}

那么按上面的讲解,HttpServletRequestWrapper就是被装饰者。

同理,任何继承了HttpServletRequestWrapper的就是装饰者。

转载于:https://blog.51cto.com/11545911/2147419

你可能感兴趣的文章
install wubi
查看>>
python使用logging进行日志配置
查看>>
开上一博
查看>>
Java arcface 2.0 最新版 离线人脸识别SDK
查看>>
【开源】.Net Aop(静态织入)框架 BSF.Aop
查看>>
resin容器配置影响listener加载时机
查看>>
《Python实现删除目录下相同文件》学习到的知识
查看>>
NTP服务器
查看>>
网站运维——Chrome 神奇的21秒
查看>>
Linux下的特殊文件权限(suid sgid sbit)
查看>>
Python 模块学习:os模块
查看>>
python 编译
查看>>
AD站点复制拓扑
查看>>
由Java爬虫所想到的
查看>>
ddk,wdk版本
查看>>
最全Redis49题详细答案:线程设计+哨兵+复制+事务+集群+持久化等
查看>>
网游UI解决方案的选择(CEGUI/MYGUI/Hikari/Scaleform/...)
查看>>
5.10-17项目经理考试圆梦提分现场面授行动
查看>>
文件服务器管理
查看>>
LAMP+zend+eaccelerator环境搭建详细教程(适合初学者)
查看>>