2011-09-29 56 views
0

我有兩個服務器,我將從一個客戶端連接到。對於每個服務器,我將做一個ftp「put」和一個「rm」。立面圖案,這可以嗎?

我應該建立一個門面,並有一個這樣的接口:

void putFileOnServer1(String file) 
void putFileOnServer2(String file) 
void removeFromServer1(String file) 
void removeFromServer2(String file) 

而且,應該立面處理的連接和斷開所有的建立? 如果是這樣,它是否應該使用工廠來做到這一點?

+4

您是試圖選擇模式來嵌入到您的設計中,還是試圖瞭解設計特定解決方案時常見的模式?前者導致設計錯誤的解決方案,而第二種則可能需要更多關於你想要解決的問題的細節。 – atk

回答

1

你有兩個方法,PutFileOnServer和RemoveFromServer。您正在放入或移除哪臺服務器應該是抽象的一部分。

+0

我沒有看到,我將如何告訴門面哪臺服務器我要放置該文件? – bmw0128

+1

說實話,如果你只有2個服務器,並且它們都是FTP,你應該有一個類,並且這個類的兩個實例根據FTP設置的不同而不同。如果它們僅因FTP設置而異,則不應爲每個FTP服務器創建一個類。 – starskythehutch

+0

謝謝,學習,如果有100臺服務器,你會怎麼做? – bmw0128

0

您通常使用外牆來降低多種對象類型之間的複雜性。不過,在這種情況下,您似乎只想使用一個功能「類型」,即「FTPServer」。那麼,大多數情況下,你應該只有兩個這種類型的實例,這種類型將有一個「put」和「remove」方法。

當您添加不必要的功能點時,實際上會增加維護的複雜性。例如,如果你需要爲你的函數添加一個新的參數(可能是訪問限制或其他),你不僅需要改變每個使用地點,而且現在必須添加每個facade方法。抽象應該減少這種類型的耦合,而不是增加它。

+0

所以每個ftp服務器都有一個外觀? – bmw0128

+0

不,除了增加複雜性外,門面似乎不會給你任何東西。您只是添加方法而不添加功能。這種現有職責的重複只會增加維護費用。這裏不要使用外牆,因爲沒有理由。只需使用普通的日常物品即可。 – ex0du5

1

ftp服務器有不同的接口嗎?還是他們都明白你想要使用的同一套命令?

  1. 如果是這樣,那麼只需創建一個FtpServer接受連接信息的類。並創建一個FtpClient類,接受多個服務器,例如您可以通過某個鍵來選擇。 (至少在某種程度上,這可能是我會做的事)。

    class FtpClient 
    { 
        public function addServer(FtpServer $server, $key); 
    
        public function selectServer($key); 
    
        public function putFileOnServer($file); 
    
        public function removeFileFromServer($file); 
    } 
    
  2. 如果不是,你必須爲每個執行一類已經,通過它們的接口不同,比如像:

    class FtpServerFoo 
    { 
        public function selectFile($file); 
        public function removeSelectedFile(); 
    } 
    
    class FtpServerBar 
    { 
        public function removeFile($file); 
    } 
    

    ...你應該看看Adapter Pattern

    abstract class FtpServer 
    { 
        abstract public function putFile($file); 
        abstract public function removeFile($file); 
    } 
    
    class FtpServerAdapterFoo 
        extends FtpServer 
    { 
        public function __construct(FtpServerFoo $server) 
        { 
        } 
    
        public function removeFile($file) 
        { 
         $this->server->selectFile($file); 
         $this->server->removeSelectedFile(); 
        } 
    } 
    
    class FtpServerAdapterBar 
        extends FtpServer 
    { 
        public function __construct(FtpServerBar $server) 
        { 
        } 
    
        public function removeFile($file) 
        { 
         $this->server->removeFile($file); 
        } 
    } 
    
    $cilent = new FtpClient(); 
    $client->addServer(new FtpServerAdapterFoo(new FtpServerFoo()), 0); 
    $client->addServer(new FtpServerAdapterBar(new FtpServerBar()), 1); 
    
    $client->selectServer(0); 
    $client->putFileOnServer($file); 
    
    $client->selectServer(1); 
    $client->removeFileFromServer($someOtherfile); 
    
  3. 如果你沒有爲不同的FTP服務器,但單個類,那麼你可以實現相同的接口(或繼承抽象類)用於每個ftp服務器實現,並再次使用與上面類型相同的FtpClient類。

    儘管這裏並不是真正的門面模式。