本文共 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