您的位置:首页 > 编程语言 > Java开发

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

2016-11-28 10:16 405 查看
废话不多说,直接上代码:

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种模式分别是用于什么样的场景?

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

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

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

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

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

如果大家对一些开源的源码有一定了解的话,会发现,如果你对设计模式有了一些了解,那么在你读源码的过程当中,会变得轻松很多,因为这个相当于,人家要说啥,你很容易就明白了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: