0

1つのクライアントから接続するサーバーが2つあります。サーバーごとに、ftpの「put」と「rm」を実行します。

1つのファサードを構築し、次のようなインターフェイスを使用する必要があります。

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

そして、ファサードは接続の確立と切断のすべてを処理する必要がありますか?もしそうなら、それはそうするために工場を使うべきですか?

4

3 に答える 3

1

ftpサーバーには異なるインターフェースがありますか?それとも、あなたがすでに利用したい同じコマンドのセットをすべて理解していますか?

  1. その場合は、FtpServer接続情報を受け入れるクラスを1つ作成するだけです。また、複数のサーバーを受け入れるクラスを作成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 );
    }
    

    ...アダプタパターンを調べる必要があります:

    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クラスを再度使用できます。

    ただし、ここに含まれるファサードパターンは実際にはありません。

于 2011-09-29T23:20:09.553 に答える
1

PutFileOnServerとRemoveFromServerの2つのメソッドがあります。どのサーバーを配置または削除するかは、抽象化の一部である必要があります。

于 2011-09-29T22:29:46.643 に答える
0

通常、ファサードを使用して、複数のオブジェクトタイプ間の複雑さを軽減します。ただし、この場合、機能する「タイプ」は「FTPServer」の1つだけを使用するようです。したがって、ほとんどの場合、このタイプのインスタンスは2つだけである必要があり、このタイプには「put」メソッドと「remove」メソッドがあります。

不要なファンクションポイントを追加すると、実際にはメンテナンスの複雑さが増します。たとえば、関数に新しいパラメーターを追加する必要がある場合(アクセス制限など)、使用場所ごとに変更するだけでなく、各ファサードメソッドを追加する必要があります。抽象化は、このタイプの結合を増やすのではなく、減らす必要があります。

于 2011-09-29T22:34:20.553 に答える