目录

前面又介绍完了结构行为类型的设计模式,最后要介绍的是关系型设计模式。本篇下介绍常用的策略模式。

策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。

需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅助类),提供辅助函数。

代码示例

<?php
/**
 * Description of StrategyDemo
 * 策略模式
 * @author jm
 */
class StrategyDemo
{
    //put your code here
    public static function main()
    {
        $price = 100;
//        $discount = new Discount7();//由外部客户端选择策略,不论什么策略都提供最终计算价格
        $discount = new DiscountFactory(7);//结合工厂
        echo "原价:".$price.",最终价格:".$discount->count($price)."\n";
        
    }
}

interface IDiscount{
    public function count($price);
}

class Discount9 implements IDiscount{
    public function count($price){
        return $price * 0.9;
    }
}

class Discount7 implements IDiscount{
    public function count($price){
        return $price * 0.7;
    }    
}
class Discount5 implements IDiscount{
    public function count($price){
        return $price * 0.5;
    }    
}

class DiscountFactory{
    private $_discount = null;
    public function __construct($discountInt)
    {
        switch ($discountInt) {
            case 5:
                $this->_discount =  new Discount5();
                break;                
            case 7:
                $this->_discount =  new Discount7();
                break;                
            case 9:
                $this->_discount =  new Discount9();
                break;
            default:
                return null;
        }
    }
    public function count($price){
        return $this->_discount->count($price);
    }
}

StrategyDemo::main();

输出:

原价:100,最终价格:70

小结

策略模式的决定权在用户,系统本身提供不同算法的实现,比如打折算法,对各种算法做封装。因此,策略模式多用在算法决策系统中,外部用户只需要决定用哪个算法即可。

面向对象的编程,并不是类越多越好,类的划分为了封装,但分类的基础是抽象,具有相同属性和功能的对象集合才是类。

策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。


本文部分收藏来自互联网,仅用于学习研究,著作权归原作者所有,如有侵权请联系删除

markdown @TsingChan