废话很少说,直接上代码:设计模式
public interface Sourceable {
public void method();
}ide
public class Source implements Sourceable {
@Override
public void method() {
System.out.println("I am the source");
}
}函数
这里是一个代理类:this
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!");
}
}spa
这里是一个装饰类:设计
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();
}
}class
这两个类,乍一看,好像差很少啊,实现的功能也差很少。
若是说有什么不同的地方,无非就是构造函数的时候,一种是本身生成了一个(代理),一种是传进来一个。
咱们该怎么理解这样的不一样呢?或者说2种模式分别是用于什么样的场景?
语义,咱们仍是从语义的层面上,来理解这个问题。
笔者最近正在卖房,就拿这个举例吧,我有套房,要卖,但是自己我事情比较多,或者我在外地,那么我能够去公证处作个公正,让另一我的全权代理我在卖房过程当中的各类事情。那么对于买家而言,他是见不到个人,他见到的只是个人代理人。这就是代理。
那么装饰呢,能够这么理解,我要卖房,但是我没啥经验,因此我找了个明白人,在卖房的过程当中,一直陪着我,过程当中给我出谋划策,让我在这个过程中规避掉一些风险。这就是装饰。
那么具体到代码上,何时用装饰,何时用代理,简单地说,若是你的被代理对象是不方便出面的,那就用代理,若是你不介意让别人知道他是谁,那就用装饰者。
设计模式,按照个人理解,它的命名和使用,一方面固然是你的代码结构更加优雅,具备更好的可扩展性,还有一方面也是很重要的缘由,便于其余人的理解,换句话说,咱们能够把设计模式,当作,面向对象世界当中的一组高级的、通用的原语,在你们对设计模式都有了充分的理解的基础上,你们对一组词汇,应该是有着差很少的理解。
若是你们对一些开源的源码有必定了解的话,会发现,若是你对设计模式有了一些了解,那么在你读源码的过程中,会变得轻松不少,由于这个至关于,人家要说啥,你很容易就明白了!