欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-04 22:21:46
...

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

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

 

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

 

一、装饰设计模式

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

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

 

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

    下面是原有的功能:

/**信息接口*/
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方式。这个以后再写

 

    

上一篇: 代理设计模式

下一篇: 建造者模式