- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道是否可以获得一些帮助。
我有一个像这样的界面
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/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!