廢話很少說,直接上代碼:設計模式
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種模式分別是用於什麼樣的場景?
語義,咱們仍是從語義的層面上,來理解這個問題。
筆者最近正在賣房,就拿這個舉例吧,我有套房,要賣,但是自己我事情比較多,或者我在外地,那麼我能夠去公證處作個公正,讓另一我的全權代理我在賣房過程當中的各類事情。那麼對於買家而言,他是見不到個人,他見到的只是個人代理人。這就是代理。
那麼裝飾呢,能夠這麼理解,我要賣房,但是我沒啥經驗,因此我找了個明白人,在賣房的過程當中,一直陪着我,過程當中給我出謀劃策,讓我在這個過程中規避掉一些風險。這就是裝飾。
那麼具體到代碼上,何時用裝飾,何時用代理,簡單地說,若是你的被代理對象是不方便出面的,那就用代理,若是你不介意讓別人知道他是誰,那就用裝飾者。
設計模式,按照個人理解,它的命名和使用,一方面固然是你的代碼結構更加優雅,具備更好的可擴展性,還有一方面也是很重要的緣由,便於其餘人的理解,換句話說,咱們能夠把設計模式,當作,面向對象世界當中的一組高級的、通用的原語,在你們對設計模式都有了充分的理解的基礎上,你們對一組詞彙,應該是有着差很少的理解。
若是你們對一些開源的源碼有必定了解的話,會發現,若是你對設計模式有了一些瞭解,那麼在你讀源碼的過程中,會變得輕鬆不少,由於這個至關於,人家要說啥,你很容易就明白了!