gpt4 book ai didi

PHP - 使用接口(interface)、策略模式和可选方法参数

转载 作者:行者123 更新时间:2023-12-02 20:56:14 25 4
gpt4 key购买 nike

我想知道是否可以获得一些帮助。

我有一个像这样的界面

interface BackupContract {
public function testConn($request, $port);
}

那么该接口(interface)的2个示例实现如下

class FTPBackup implements BackupContract {
public function testConn($request, $port = 21) {
// code here
}
}

class SFTPBackup implements BackupContract {
public function testConn($request, $port = 22) {
// code here
}
}

由于我需要在运行时指定“服务”和端口等内容,因此我使用“策略模式”来实现此目的,如下所示。

class BackupStrategy {
private $strategy = NULL;

public function __construct($service) {

switch ($service) {
case "ftp":
$this->strategy = new FTPBackup();
break;
case "sftp":
$this->strategy = new SFTPBackup();
break;
}

}

public function testConn($request, $port)
{
return $this->strategy->testConn($request, $port);
}
}

最后,在我的 Controller 中,我使用以下代码将它们组合在一起。

$service = new BackupStrategy($request->input('service'));
$service->testConn($request, $request->input('port'));

问题是,如果用户没有输入端口,则意味着自动分配端口变量,即 21 或 22,如 2 个实现中所示。

它似乎不起作用,但它没有抛出任何错误

最佳答案

但是您不应该在 BackupStrategy 的构造函数中实现该开关。

您的做法违反了 S.O.L.I.D 原则中的“开放/封闭”原则。

任何时候您需要添加另一个“备份策略”,您都需要修改 BackupStrategy 类,将逻辑添加到构造函数中。这不好。

您可以创建子类,每个子类实现每个备份策略类的实现(LOL),并且仅从 BackupStrategy 类继承必要的部分。

interface BackupContract {
public function testConn($request, $port);
}

class FTPBackup implements BackupContract {
public function testConn($request, $port = 21) {
// code here
}
}

class SFTPBackup implements BackupContract {
public function testConn($request, $port = 22) {
// code here
}
}

class BackupStrategy
{
private $strategy;

public function testConn($request, $port)
{
return $this->strategy->testConn($request, $port);
}
}

class ConcreteFTPBackup extends BackupStrategy
{
function __construct()
{
$this->strategy = new FTPBackup();
}
}

class ConcreteSFTPBackup extends BackupStrategy
{
function __construct()
{
$this->strategy = new SFTPBackup();
}
}

$service = new ConcreteFTPBackup();

$serice->testConn($request, $request->input('port'));

甚至是这样:

interface BackupContract {
public function testConn($request, $port);
}

class FTPBackup implements BackupContract {
public function testConn($request, $port = 21) {
// code here
}
}

class SFTPBackup implements BackupContract {
public function testConn($request, $port = 22) {
// code here
}
}

class BackupStrategy
{
private $strategy;

function __construct(BackupContract $bc)
{
$this->strategy = $bc();
}

public function testConn($request, $port)
{
return $this->strategy->testConn($request, $port);
}
}


$service = new BackupStrategy(new FTPBackup());

$serice->testConn($request, $request->input('port'));

然后您可以在运行时实现切换。

您还可以在 BackupStrategy 类中创建一个 setStrategy 方法,用于在运行时设置或更改备份策略:

public function setStrategy(BackupContract $bc)
{
$this->strategy = $bc();

}

现在,您可以在运行时创建具有一种备份策略的服务,甚至也可以在运行时更改策略!查出:

$service = new BackupStrategy(new FTPBackup());
$service->testConn($request, $request->input('port'));


$service->setStrategy(new SFTPBackup());
$service->testConn($request, $request->input('port'));

BackupStrategy 类是所有封装算法汇聚的地方,但不要忘记这一切中的“封装”!

策略模式中最重要的是对一系列可以在运行时使用的算法的封装!

希望对你有帮助!

关于PHP - 使用接口(interface)、策略模式和可选方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40302261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com