在简单工厂模式里有一些瑕疵,虽然PHP不需要重新编译但小张之后每次新加一个支付方式都要告知负责人去修改PayFactory。实例化对象的逻辑全部封装在一个工厂类里,每次需求变化都要单独修改工厂类(违反了开闭原则),而且出了异常可能所有相关功能类都正常工作。
我们可以用工厂模式来解决简单工厂,首先申明设计模式不是算法,它只有适合与不适合,没有性能优劣之分。我们今天还可用策略模式来解决。
策略模式:是对象的行为模式,用意是对一组算法的封装。动态的选择需要的算法并使用。以下是具体实现步骤:
此时负责人制定两个接口Payment
/**
* file name: PayFactory.php
* user : 良子
* date : 2020-12-28
*/
interface Payment {
/**
* *@function 订单支付
* @param array $input 支付订单信息
* @return array [
* 'status'=> 1 , //状态 1:成功, 2:失败
* 'message' => '支付成功' //结果说明
* ]
*/
public function pay(array $input);
/**
* @function 用户支付后第三方支付的回调验证
* @param array $input
* @return array [
* 'status'=> 1 , //状态 1:成功, 2:失败
* 'message' => '支付成功' //结果说明
* ]
*/
public function notify(array $input);
}
支付Pay类
class Pay
{
public function goPay (Payment $pay, $input)
{
$pay->pay($input);
}
public function notify (Payment $pay, $input)
{
$pay->notify($input);
}
}
小张的工作实现支付宝支付类(Alipay)
/**
* file name: Alipay.php
* user : 小张
* date : 2020-12-28
*/
class Alipay implements Payment
{
public function pay (array $input)
{
// TODO: Implement pay() method.
echo '<br/>正在与支付宝进行对接……<br/>';
echo '对接成功……<br/>';
return ['status'=>1, 'message'=>'支付宝支付成功'];
}
public function notify (array $input)
{
// TODO: Implement notify() method.
echo '<br/>正在与支付宝进行对接……<br/>';
echo '校验成功……<br/>';
return ['status'=>1, 'message'=>'支付宝回调校验成功'];
}
}
小李的工作实现微信支付类(Wechat)
/**
* file name: Wechatpay.php
* user : 小李
* date : 2020-12-27
*/
class Wechatpay implements Payment
{
public function pay (array $input)
{
// TODO: Implement pay() method.
echo '<br/>正在与微信进行对接……<br/>';
echo '对接成功……<br/>';
return ['status'=>1, 'message'=>'微信支付成功'];
}
public function notify (array $input)
{
// TODO: Implement notify() method.
echo '<br/>正在与微信进行对接……<br/>';
echo '校验成功……<br/>';
return ['status'=>1, 'message'=>'微信回调校验成功'];
}
}
小王的工作是实现订单的业务逻辑,并根据用户的选择调用不同的支付方式:
$input = [
'order_no' => '订单号',
'total' => '10',
'payment' => 'Alipay'
];
$Pay = new pay;
switch ($input['payment']) {
case 'Alipay':
$payment = new Alipay();
break;
case 'Wxpay':
$payment = new Wxpay();
break;
}
$Pay = new Pay();
$Pay->goPay($payment, $input);
如果之后小张要新加paypal只需要创建Paypalpay去实现Payment,然后告知小王即可。
生活有许多例子是关于策略模式的。例如:
如果我需要在去北京出差,我可以有几个策略考虑:我可以乘坐飞机,乘坐高铁,走路或其它的途径。每个策略可以得到相同的结果,但是使用了不同的资源。
策略模式的角色
-
抽象策略角色:Payment接口
-
具体策略角色:Alipay,Wxpay类
-
环境角色:Pay类。
实现步骤:
-
1.定义抽象角色类(定义好各个实现的共同抽象方法)
-
2.定义具体策略类(具体实现父类的共同方法)
-
3.定义环境角色类(私有化申明抽象角色变量,重载构造方法,执行抽象方法)
关注快乐程序员公众号,每日分享一点小知识。爱编程,爱生活!