设计模式 策略模式

WechatIMG13.jpeg

介绍

策略模式是一种设计模式,它提供了一种灵活的方法来定义一组算法,并将其封装在一个独立的类中,使得其可以互相替换。通俗点说,策略模式就是把一系列的算法封装成独立的类,让它们可以相互替换,从而达到灵活地改变对象的行为的目的。策略模式在实际应用中比较常见,例如排序算法、加密算法、路由算法等都可以使用策略模式来实现。

角色

角色 说明
Context 环境类,使用一个 ConcreteStrategy 对象来配置;维护一个对 Stategy 对象的引用,同时,可以定义一个接口来让 Stategy 访问它的数据
Strategy 抽象策略类,定义所有支持的算法的公共接口。Context 使用这个接口来调用某 ConcreteStrategy 定义的算法
ConcreteStrategy 具体策略类,实现 Strategy 接口的具体算法

角色示例

在支付系统中,支付方式就是一个典型的应用场景,不同的支付方式可以通过不同的算法来实现,例如银行卡支付、花呗支付、余额宝支付等等。

类名 担任角色 说明
Order 环境 订单类
PayMethod 抽象策略 支付方式类
BankCard 具体策略 银行卡支付类
Huabei 具体策略 花呗支付类
YuEBao 具体策略 余额宝支付类

代码

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
<?php 
abstract class PayMethod
{
abstract function pay();
}

class BankCard extends PayMethod
{
public function pay()
{
return "更换银行卡支付".PHP_EOL;
}
}

class Huabei extends PayMethod
{
public function pay()
{
return "更换花呗支付".PHP_EOL;
}
}

class YuEBao extends PayMethod
{
public function pay()
{
return "更换余额宝支付".PHP_EOL;
}
}

class Order
{
protected $payMethod;

public function setPayMethod(PayMethod $payMethod)
{
$this->payMethod = $payMethod;
}

public function pay()
{
return $this->payMethod->pay();
}
}

$order = new Order();
$bankCard = new BankCard();
$yuEBao = new yuEBao();
$huabei = new Huabei();
$order->setPayMethod($bankCard);
echo $order->pay();
$order->setPayMethod($yuEBao);
echo $order->pay();
$order->setPayMethod($huabei);
echo $order->pay();

创建 Pay.php,内容如上。

执行

1
2
3
4
$ php Pay.php
更换银行卡支付
更换余额宝支付
更换花呗支付
-------------本文结束感谢您的阅读-------------
0%