java 设计模式 (代理模式和装饰者模式的区别)

本文通过生动的例子解析了代理模式与装饰模式的区别及应用场景。代理模式适用于被代理对象不方便直接出面的情况,而装饰模式则是在不影响原对象的前提下进行功能增强。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值