策略设计模式

什么是策略设计模式

策略模式定义了一系列的算法,并且将每一个算法封装起来。这几个算法是可以相互替换的。策略模式让算法独立于使用它的客户而独立变化。

简单来讲:策略模式可以让你想用哪种方式实现就用哪种方式实现。例如:php 使用 pdo 或是 mysqli 来连接 mysql

为什么要使用

  1. 隐藏具体实现细节
  2. 方便切换算法

类型

行为型模式

参与者

  • Context 上下文类

    • 用于管理具体使用的策略
  • IStrategy 策略接口
    -

  • ConcreteStrategy 具体策略类

    • 实现具体的算法

例子

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<?php

/**
* 策略接口
*
* Interface IStrategy
*/
interface IStrategy {
public function algorithm();
}

class PhpStrategy implements IStrategy {
public function algorithm()
{
echo "php algorithm: echo 'Hello, World'".PHP_EOL;
}
}

class LuaStrategy implements IStrategy {
public function algorithm()
{
echo "Lua algorithm: print('Hello, World')".PHP_EOL;
}
}

class CppStrategy implements IStrategy {
public function algorithm()
{
echo 'C++ algorithm: cout << "Hello, World" << endl;'.PHP_EOL;
}
}

/**
* 上下文类,用于管理使用的具体策略
*
* Class Context
*/
class Context {
private $strategy;

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

public function setLanguage(IStrategy $strategy)
{
$this->strategy = $strategy;
}

public function printHelloWorld()
{
$this->strategy->algorithm();
}
}


/**
* 客户端代码
* Class Client
*/
class Client {
public function run()
{
$context = new Context(new PhpStrategy());
$context->printHelloWorld();

$context->setLanguage(new CppStrategy());
$context->printHelloWorld();

$context->setLanguage(new LuaStrategy());
$context->printHelloWorld();
}
}

$client = new Client();
$client->run();
1
2
3
php algorithm: echo 'Hello, World'
C++ algorithm: cout << "Hello, World" << endl;
Lua algorithm: print('Hello, World')