iT邦幫忙

2022 iThome 鐵人賽

DAY 18
0
自我挑戰組

【從工程師升級成為資深工程師的那檔事】 系列 第 18

【從工程師升級成為資深工程師的那檔事Day 18】設計模式 - 代理模式

  • 分享至 

  • xImage
  •  

代理模式這個概念在並不只是在軟體設計這塊會使用到,在現實生活中的運用也非常的多元。
而在設計模式中代理模式也有延遲代理、保護代理...等,
不同的代理功能。

代理模式 Proxy Pattern

定義

為目標物件設計一個替代物件,並讓用戶端使用替代物件操作。

用途

代理模式有非常多種功能的運用,不過個人認為有三種比較符合:

  • 延遲載入:
    延遲對目標的載入,來提高系統的效能
    (個人認為虛擬代理也屬於其中)
  • 保護代理
    控制物件的訪問,給與不同使用者不同的使用權限(也可能是不同回應)。
    (個人認為防火牆代理也屬於其中)
  • 遠端代理
    讓一個位於不同地址的物件,提供一個區域的代表物件。
    (簡言之就是可以跨區服務)

應用

假設我們今天要設計一個情境為了防止我們的伺服器被阻斷服務攻擊(DDOS),
當遇到過大的封包,我們直接阻擋在伺服器之外,其他的訊息才給予進入伺服器。

  1. 當看到大量訊息(大於等於10個字的長度)的請求直接回應NO
  2. 當看到正常訊息(小於10個字的長度)的請求回應OK

// 做伺服器的介面,定義需要完成的功能
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)添增新的功能。
但是兩者的使用的理念有些許的不同,
對於裝飾器模式著重在連動
而代理模式則是著重在選擇上。


上一篇
【從工程師升級成為資深工程師的那檔事Day 17】設計模式 - 外觀模式
下一篇
【從工程師升級成為資深工程師的那檔事Day 19】淺談結構型設計模式(總結)
系列文
【從工程師升級成為資深工程師的那檔事】 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言