我将从一个客户端连接两台服务器。对于每个服务器,我将执行ftp“put”和“rm”。
我应该构建一个外观,并且有这样的界面:
void putFileOnServer1(String file)
void putFileOnServer2(String file)
void removeFromServer1(String file)
void removeFromServer2(String file)
并且,门面应该处理所有连接的建立和断开连接吗? 如果是这样,它应该使用工厂吗?
答案 0 :(得分:1)
您有两种方法,PutFileOnServer和RemoveFromServer。您要放置或移除的服务器应该是抽象的一部分。
答案 1 :(得分:1)
ftp服务器有不同的接口吗?或者他们都了解您想要使用的同一组命令?
如果是这样,那么只需创建一个接受连接信息的FtpServer
类。并创建一个接受多个服务器的FtpClient
类,您可以通过某些键来选择它们。 (至少在某种程度上,这可能是我会做的事情。)
class FtpClient
{
public function addServer( FtpServer $server, $key );
public function selectServer( $key );
public function putFileOnServer( $file );
public function removeFileFromServer( $file );
}
如果没有,并且您已经为每个单独的实现创建了一个类,它们的接口有所不同,例如:
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 );
如果您还没有针对不同FTP服务器的单独类,那么您可以为每个ftp服务器实现实现相同的接口(或继承抽象类),并使用相同类型的FtpClient类作为一个再次上面。
虽然不是这里涉及的外观模式。
答案 2 :(得分:0)
您通常使用外观来降低多个对象类型之间的复杂性。但是,在这种情况下,您似乎只想使用一个功能“类型”,即“FTPServer”。那么,在大多数情况下,你应该只有两个这种类型的实例,这种类型将有一个“put”和“remove”方法。
当您添加不必要的功能点时,实际上会增加维护的复杂性。例如,如果您需要向函数添加新参数(可能是访问限制或其他),您不仅需要针对每个使用位置进行更改,而且现在必须添加每个Facade方法。抽象应该减少这种类型的耦合,而不是增加它。