• 大话设计模式之PHP篇


    什么是策略模式?

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

    组成:
    抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
    具体策略角色:包装了相关的算法和行为。
    环境角色:持有一个策略类的引用,最终给客户端调用。

    百度了一下,还是没有搞明白策略模式与工厂模式的本质区别,只是有了一些表象的理解。

    我将工厂模式中用到的例子进行了改写:

    工厂模式:http://www.tinysoft.me/index.php/archives/27/

    即所谓的策略模式,代码如下

    <?php
    /*定义抽象类*/
    abstract class Operate {
        public abstract function get_Value($val1, $val2);
    }
    
    /*加法类*/
    Class Operate_Add extends Operate {
        public function get_Value($val1, $val2) {
            return $val1 + $val2;
        }
    }
    
    /*减法类*/
    Class Operate_Sub extends Operate {
        public function get_Value($val1, $val2) {
            return $val1 - $val2;
            }
    }
    
    /*乘法类*/
    Class Operate_Multiply extends Operate {
        public function get_Value($val1, $val2) {
            return $val1 * $val2;
            }
    }
    
    /*除法类*/
    Class Operate_Divide extends Operate {
        public function get_Value($val1, $val2) {
            return $val1 / $val2;
            }
    }
    
    /*上下文类*/
    Class Context {
        
        private static $op;
        
        public static function Create_Operation($operate) {
            Switch($operate) {
                Case '+': self::$op = new Operate_Add;
                break;
    
                Case '-': self::$op = new Operate_Sub;
                break;
    
                Case '*': self::$op = new Operate_Multiply;
                break;
    
                Case '/': self::$op = new Operate_Divide;
                break;
            }
    
        }
        public function get_Result($val1, $val2) {
            return self::$op->get_Value($val1, $val2);
        }
    }
    
    
    $mys = new Context;
    $mys->Create_Operation ('+');
    $result = $mys->get_Result(1, 2);
    echo $result;

    网上一篇关于工厂模式与策略模式区别的解析:

    1、按一般教程中出现的例子理解

    简单工厂模式:传条件进工厂类,工厂类就会返回一个对象给调用者,供调用者使用,最终给用户使用的是工厂类返回的类

    策略模式:创建一个Context类(可以看作是工厂模式中工厂类的代替品)的对象A,传一个要使用的策略实例对象给A,然后使用A调用A中的某些方法---最终给用户用的是Context类

    简单的说,工厂有进货也有出货,然后使用出货。策略有进货没出货,然后使用得货者。

    2、更准确理解

    用户是使用工厂类生产的对象进行操作,而用户是使用用户自己传给策略的对象进行操作。

    简单的说,工厂类的使用者需要不是自己创建的对象,策略模式中Context类的使用者需要的是自己创建的对象。

    更简单的说,工厂模式:我没有,我需要你的。策略模式:我自己有,我用我自己的。

    本人认为上述对工厂模式和策略模式的理解还是比较不错的,至少对于刚接触到的新手还是很容易理解的,具体的深度解析,还需要在项目中不断的实践!

    上述代码似乎与我们平时所做的系统联系不大,我下面举一个web开发中要用到的例子,能加深对策略模式的理解。

    假设我们有一套商城系统,商城系统中不可避免的有会员系统,会员分为普通会员、银会员、金会员,针对不同的会员我们有不同的打折措施,不同的打折措施,影响会员对商品的支付金额不同。

    <?php
    /*抽象策略接口*/
    interface Member {
        public function get_Price($price);
    }
    /*具体算法策略*/
    class Normal_Member implements Member {
        public function get_Price($price) {
            return $price;
        }
    }
    
    class Vip_Member implements Member {
        public function get_Price($price) {
            return $price*0.8;
        }
    }
    
    class Ultimate_Member implements Member {
        public function get_Price($price) {
            return $price*0.6;
        }
    }
    /*环境上下文,获得抽象策略的引用*/
    class Context {
        private $instance;
        public function __construct($instance) {
            $this->instance = $instance;
        }
        
        public function get_Result($price) {
            return $this->instance->get_Price($price);
        }
    }
    
    $p = new Context(new Ultimate_Member);
    echo $p->get_Result(100);
    ?>

    抽象策略角色:定义所有支持的算法的公共接口,通常是以一个接口或抽象来实现,Context使用这个接口来调用其定义的算法。
    具体策略角色:以抽象策略角色接口实现某具体算法。
    环境角色:持有一个抽象策略角色类的引用,并返回操作结果。

  • 相关阅读:
    原生JS中Ajax的使用方法
    back-to-top回到顶部
    atom插件
    git 命令操作
    常用font-family
    上传按钮美化
    mongodb
    GraphicsMagick命令
    enctype=“multipart/form-data”详解
    操作符
  • 原文地址:https://www.cnblogs.com/fancing/p/6394199.html
Copyright © 2020-2023  润新知