博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 设计模式 (代理模式和装饰者模式的区别)
阅读量:6670 次
发布时间:2019-06-25

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

hot3.png

废话不多说,直接上代码:

public interface Sourceable {

    public void method();
}

public class Source implements Sourceable {

    @Override
    public void method() {
        System.out.println("I am the source");
    }
}

这里是一个代理类:

public class Proxy implements Sourceable {

    private Source source;
    public Proxy(){
        super();
        this.source = new Source();
    }
    @Override
    public void method() {
        before();
        source.method();
        atfer();
    }
    private void atfer() {
        System.out.println("after proxy!");
    }
    private void before() {
        System.out.println("before proxy!");
    }
}

这里是一个装饰类:

public class Decorator implements Sourceable {

    private Sourceable source;

    public Decorator(Sourceable source){

        super();
        this.source = source;
    }
    @Override
    public void method() {
        System.out.println("before decorator!");
        source.method();
        System.out.println("after decorator!");
    }

    public static void main(String[] args) {

        Sourceable source = new Source();
        Sourceable obj = new Decorator(source);
        obj.method();
    }
}

这两个类,乍一看,好像差不多啊,实现的功能也差不多。

如果说有什么不一样的地方,无非就是构造函数的时候,一种是自己生成了一个(代理),一种是传进来一个。

我们该怎么理解这样的不同呢?或者说2种模式分别是用于什么样的场景?

语义,我们还是从语义的层面上,来理解这个问题。

笔者最近正在卖房,就拿这个举例吧,我有套房,要卖,可是本身我事情比较多,或者我在外地,那么我可以去公证处做个公正,让另外一个人全权代理我在卖房过程中的各种事情。那么对于买家而言,他是见不到我的,他见到的只是我的代理人。这就是代理。

那么装饰呢,可以这么理解,我要卖房,可是我没啥经验,所以我找了个明白人,在卖房的过程中,一直陪着我,过程中给我出谋划策,让我在这个过程当中规避掉一些风险。这就是装饰。

那么具体到代码上,什么时候用装饰,什么时候用代理,简单地说,如果你的被代理对象是不方便出面的,那就用代理,如果你不介意让别人知道他是谁,那就用装饰者。

设计模式,按照我的理解,它的命名和使用,一方面当然是你的代码结构更加优雅,具有更好的可扩展性,还有一方面也是很重要的原因,便于其他人的理解,换句话说,我们可以把设计模式,当做,面向对象世界当中的一组高级的、通用的原语,在大家对设计模式都有了充分的理解的基础上,大家对一组词汇,应该是有着差不多的理解。

如果大家对一些开源的源码有一定了解的话,会发现,如果你对设计模式有了一些了解,那么在你读源码的过程当中,会变得轻松很多,因为这个相当于,人家要说啥,你很容易就明白了!

转载于:https://my.oschina.net/dongtianxi/blog/795251

你可能感兴趣的文章
赢在起跑点半途就退场,锂电池先行者企业黯然离席
查看>>
手把手教你启用RemoteFX以及Hyper-V GPU卸载
查看>>
《交互式程序设计 第2版》一3.10 更进一步
查看>>
液晶拼接屏的专业术语有哪些
查看>>
微博悄然取消140字限制 面向全体用户
查看>>
OA系统软件怎么选型?
查看>>
英伟达发布Tesla P4&P40两款基于Pascal架构的深度学习芯片
查看>>
《Web应用漏洞侦测与防御:揭秘鲜为人知的攻击手段和防御技术》——1.5 Web Worker...
查看>>
《UNIX网络编程 卷1:套接字联网API(第3版)》——8.10 UDP程序例子小结
查看>>
拯救 Firefox !
查看>>
《人工智能:计算Agent基础》——2.2 Agent系统
查看>>
Firefox 53 Beta 引入两个新 “Compact” 主题
查看>>
英特尔增强 Android 安全 提高自家芯片吸引力
查看>>
《腾讯iOS测试实践》一一1.2 工程效率
查看>>
《Photoshop Lightroom4 经典教程》—第1课1.1节了解Lightroom的工作方式
查看>>
《数据科学:R语言实现》——第2章 数据抽取、转换和加载
查看>>
《深入理解Spark:核心思想与源码分析》——3.7节创建和启动DAGScheduler
查看>>
《ANSYS Workbench有限元分析实例详解(静力学)》——2.5 Windows界面相应操作
查看>>
《R与Hadoop大数据分析实战》一1.7 Hadoop的子项目
查看>>
Google Web Designer 开始支持 Linux
查看>>