装饰者模式-创新互联

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

我们提供的服务有:成都网站建设、成都做网站、微信公众号开发、网站优化、网站认证、兴宾ssl等。为上千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的兴宾网站制作公司
BufferedReader br = new BufferedReader(InputStreamReader(new InputSteam()));

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

装饰者模式理论摘自装饰模式(Decorator)(包装器模式(Wrapper))

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的就是装饰者。

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


名称栏目:装饰者模式-创新互联
标题URL:http://ybzwz.com/article/dicosj.html