设计模式-策略模式

设计模式-策略模式

说明

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


模式说明

   1.多个类只区别在表现行为不同,可以使用策略模式,在运行时动态选择具体要执行的行为。
   2.需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
   3.对客户隐藏具体策略(算法)的实现细节,彼此完全独立。
   4.客户端必须知道所有的策略类,并自行决定使用哪一个策略类,策略模式只适用于客户端知道所有的算法或行为

https://blog.zxliu.cn/usr/uploads/2020/11/2092914566.png

代码示例

<?php
/**
 * 策略模式示例
 * 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化,即封装变化的算法。
 */
header('Content-Type: text/plain');
/**
 * 简单计算器接口
 * Interface Math
 */
interface Math{
    public function calc($op1,$op2);
}

class MathAdd implements  Math{

    public function calc($op1, $op2)
    {
        return $op1+$op2;
    }
}
class MathSub implements  Math{

    public function calc($op1, $op2)
    {
        return $op1-$op2;
    }
}
class MathMul implements Math{

    public function calc($op1, $op2)
    {
        return $op1*$op2;
    }
}
class MathDiv implements  Math{

    public function calc($op1, $op2)
    {
        if($op2==0){
            throw new Exception("除数不能为0");
        }
        return $op1/$op2;

    }
}

//封装虚拟计算器
Class CMath{
    protected  $objCalc=null;
    public function __construct($thpe)
    {
        $cale="Math" . $thpe;
        $this->objCalc= new $cale();

    }
    public function calc($op1,$op2){
        return $this->objCalc->calc($op1,$op2);
    }

}
echo "计算10跟5的加减乘除运算".PHP_EOL.PHP_EOL;
$objMath = new CMath('Add');
echo "加法运算".PHP_EOL;
echo "结果:".$objMath->calc(10,5).PHP_EOL;
$objMath = new CMath('Sub');
echo "减法运算".PHP_EOL;
echo "结果:".$objMath->calc(10,5).PHP_EOL;
$objMath = new CMath('Mul');
echo "乘法运算".PHP_EOL;
echo "结果:".$objMath->calc(10,5).PHP_EOL;
$objMath = new CMath('div');
echo "除法运算".PHP_EOL;
echo "结果:".$objMath->calc(10,5).PHP_EOL;

结果:
计算10跟5的加减乘除运算

加法运算
结果:15
减法运算
结果:5
乘法运算
结果:50
除法运算
结果:2

策略模式跟工厂模式的区别

工厂相关的模式属于创建型模式,顾名思义,这种模式是用来创建对象的,返回的是new出来的对象。要调用对象的什么方法是由客户端来决定的。

而策略模式属性行为型模式,注重策略的执行,将要调用的函数方法封装了起来,客户端只需要调用执行的策略方法就可以了。

结尾

心如花木,向阳而生。

添加新评论