设计模式-代理模式和装饰设计模式

一、代理模式和装饰设计模式

                                                                                    ——我一直不太信任自己的记忆力,所以我把它们都写下来

    为啥把这两个模式放在一起写呢?因为代理模式和装饰设计模式让人傻傻分不清楚。看了好多文章,都只是说二者的区别是:装饰设计模式是添加功能,代理模式是限制功能。太特么难理解了,我相信这篇博客肯定能让你清晰的区分装饰设计模式和代理模式。下面分别说明装饰设计模式和代理模式,然后详细说明二者的区别。

一、装饰设计模式

装饰设计模式:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

说明:对原有类进行扩展(也就是上面所说的添加功能)。

比如有这样一个需求:有个发送信息的功能,现在需要在发送信息前添加发送时间。

    下面是原有的功能:

/**信息接口*/
interface Message{
   public void sendMsg(String content);
}

/**发送短信*/
class Sms implements Message{
    public void sendMsg(String content){
        System.out.println("信息内容:"+content);
    }
}

/**模拟发送信息测试*/
class Test{
    @Test
    public void test(){
        Message msg = Sms();
        msg.sendMsg("你今天好骚!");//控制台打印出信息内容
    }
}

   

    下面是添加功能后的代码

//Message接口和Sms类和上面一样;

//下面是装饰对象
class Sms_new implements Message{
    Sms sms;
    public Sms_new(Sms sms){
        this.sms = sms;
    }
    public void sendMsg(String content){
        System.out.println("当前时间:"+new Date());
        sms.sendMsg(content);
    }
}

/**模拟发送信息测试*/
class Test{
    @Test
    public void test(){
        Message msg = Sms_new(new Sms());
        msg.sendMsg("你今天好骚!");//控制台打印出当前时间和信息内容
    }
}

 发现了没,装饰着模式只有对原有类的增加一层装饰(增加显示时间功能),并没有对原有类的控制权。比如说颠覆原有类的功能。代理模式是代理类拥有原有类的引用,主动权在代理类的手里,有它决定原有类的功能。看看代理模式

二.代理模式

    

代理设计模式:在不必改变原类文件和使用继承的情况下,控制对象的访问。

说明:装饰设计模式强调的是扩展,代理模式强调的是控制。

同样是上面装饰着模式的例子,我们把装饰类修改下;就立马变成代理设计模式了

//只对会员发送信息
class Sms_new implements Message{
    Sms sms;
    public Sms_new(Sms sms){
        this.sms = sms;
    }
    public void sendMsg(String content){
        System.out.println("当前时间:"+new Date());
        if(isVip()){
              sms.sendMsg(content);
        }eles{
              System.out.println("抱歉,你没有权限"):
        }
        
    }
}

 代理模式强调的控制就像上面例子一样,被代理类的功能是可以不被代理类执行的。到这里,我相信你已经基本上明白装饰着模式和代理模式的区别了。

      这里只是简单的说明下两种模式的概念和区别。实际运用上还是有很多难点的,比如代理模式分静态代理和动态代理,静态代理实用性不是很高,就像上面我们列举的例子。动态代理想研究透彻也是比较困难的,目前有两种的实现方式:JDK方式和CGLIB方式。这个以后再写

    

猜你喜欢

转载自zyqwst.iteye.com/blog/2287696