代理模式這個概念在並不只是在軟體設計這塊會使用到,在現實生活中的運用也非常的多元。
而在設計模式中代理模式也有延遲代理、保護代理...等,
不同的代理功能。
為目標物件設計一個替代物件,並讓用戶端使用替代物件操作。
代理模式有非常多種功能的運用,不過個人認為有三種比較符合:
假設我們今天要設計一個情境為了防止我們的伺服器被阻斷服務攻擊(DDOS),
當遇到過大的封包,我們直接阻擋在伺服器之外,其他的訊息才給予進入伺服器。
// 做伺服器的介面,定義需要完成的功能
public interface IServer{
public string accept(string msg);
}
// 創建真實伺服器,並完成accept()
public class RealServer : IServer{
public string accept(string msg){
//TODO: 處理傳進來的訊息
return "OK";
}
}
// 創建代理伺服器,並完成accept()
public class ProxyServer : IServer{
private real ;
public ProxyServer(IServer real){
//透過建構函式將真實伺服器傳入
this.real = real;
}
//透過代理伺服器處理訊息篩選的業務(決定是否進入伺服器)
public string accept(string msg){
if(msg.length < 10){
return real.accept(msg);
}
else{
return "NO";
}
}
}
public void static main(){
//建立 RealServer & ProxyServer
var real = new RealServer();
var proxy = new ProxyServer(real);
//建立要傳送出去的訊息
string msg ="ABCDEFGHIJ";
//傳送訊息 "ABCDEFGHIJ" 到proxy裡面
res = proxy.accept(msg);
//因為msg的字串長度是10 所以會回傳 "NO"
Console.WriteLine(res);
}
從前面的程式可以看出這樣的設計方式server
只要著重在提供服務,
而proxy
會負責幫我們阻擋大量的垃圾訊息。
這樣的設計方式除了可以讓我們往後修改時更加的容易外,
代理模式更常運用在不同的程式(Process)中使用。
例如透過API與SQL溝通或是nginx代理我們的所掛載的port。
代理模式 與 裝飾器模式的使用結果十分的相似,
同樣都是在符合單一職責原則(SRP)下,為類別(Class)添增新的功能。
但是兩者的使用的理念有些許的不同,
對於裝飾器模式著重在連動,
而代理模式則是著重在選擇上。