設計模式-代理模式(一)

設計模式-代理模式(一)

從出社會開始,因緣際會的讀了一本深入淺出設計模式(用Java實踐的),當時就覺得設計模式很有趣,索幸用C++把裡面的範例都實踐了一遍,最近因為開始SSM的練習,為了了解Mybatis,想從裡面的設計模式開始著手導讀,知道裡面用了動態代理的模式,但這邊先不談動態代理,而是想先從簡單的靜態代理開始,在下一篇才會繼續深度探索Mybatis的動態代理怎麼實踐的,這邊就先拿靜態代理的設計模式來練練手吧。

UML與程式碼

alt

首先我們定義一下Interface

1
2
3
public interface Subject {
void DoAction();
}

接著我們來定義目標對象以及代理對象

1
2
3
4
5
6
7
8
public class RealSubject implements Subject{

@Override
public void DoAction() {
//Do Real Some Thing
System.out.println("Real Action");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Proxy implements Subject{
RealSubject subject;
public Proxy(RealSubject subject) {
this.subject = subject;
}

@Override
public void DoAction() {
//Do Other something
System.out.println("Proxy do Action start");
subject.DoAction();
System.out.println("Proxy do Action end");
}
}

接著我們呼叫這個代理對象去實踐

1
2
3
4
5
6
public class Main {
public static void main(String[] args) {
Subject subject = new Proxy(new RealSubject());
subject.DoAction();
}
}

輸出結果自然就是

1
2
3
Proxy do Action start
Real Action
Proxy do Action end

優點以及缺點

代理模式的優點可以從上列發現,我們可以在Proxy的物件裡面做前處理,而不用針對RealSubject去做更改,也可以在RealSubject做完它的職責之後,再去做其他的處理。簡單來說我們可以把主要邏輯跟次要邏輯切開,RealSubject是我們的主要邏輯,次用邏輯可能是我們Proxy裡面的一些共用邏輯,例如我們在Mybatis需要先啟動JDBC的驅動,接著建立Connection,但中間的SQL語法可能不同,這時候我們就將相關的SQL語法放到RealSubject去做,之後我們對結果進行處理,並且關閉Connection。那麼其實透過這樣的方式,我們可以將變動的執行代碼抽出來,以達到解耦的效果。