盒子
盒子
文章目录
  1. 多功能折叠小刀
  2. 同一接口
  3. 不同实现
  4. 具体载体(context)
  5. 如何使用

PHP策略模式之多功能折叠小刀

多功能折叠小刀

从小,我们就对这个不陌生,甚至觉得,拥有一把这样的小刀,是一件很酷的事情。这样一把小刀,实在是居家旅行,必备工具,只需要一把,即可变成水果刀、剪刀或者钢锯等等,而且不占地方。

现在回想起来,这样的设计简直是大智慧有木有?一个接口响应不同策略,这正是策略模式啊~

同一接口

我们需要一把多功能的小刀,那么,所有的功能都是从这把小刀体现的,同一接口:

1
2
3
4
5
6
7
8
9
10
/**
* 抽象策略角色,以接口实现
*/
interface Strategy {

/**
* 算法接口
*/
public function algorithmInterface();
}

不同实现

我们需要哪些实现,那就实现这个接口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
* 具体策略角色:小刀
*/
class Knife implements Strategy {

public function algorithmInterface() {
echo '小刀';
}
}

/**
* 具体策略角色:剪刀
*/
class Scissors implements Strategy {

public function algorithmInterface() {
echo '剪刀';
}
}

/**
* 具体策略角色:钢锯
*/
class Hacksaw implements Strategy {

public function algorithmInterface() {
echo '钢锯';
}
}

具体载体(context)

前面我们准备好了这把小刀所需要的功能,然后我们开始打造这把小刀:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 多功能折叠小刀
*/
class FoldingKnife {
/* 引用的策略 */
private $_strategy;

public function __construct(Strategy $strategy) {
$this->_strategy = $strategy;
}

public function contextInterface() {
$this->_strategy->algorithmInterface();
}

}

如何使用

有了这把利器,我们就可以按需使用想要的工具:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
* 客户端
*/
class Client {

/**
* Main program.
*/
public static function main() {
// 打开小刀
$context = new FoldingKnife(new Knife());
$context->contextInterface();

// 打开剪刀
$context = new FoldingKnife(new Scissors());
$context->contextInterface();

// 打开钢锯
$context = new FoldingKnife(new Hacksaw());
$context->contextInterface();
}

}

Client::main();
请我喝一杯咖啡
扫一扫,支持funsoul
  • 微信扫一扫