PHP 设计模式 策略模式(Strategy)

来源:互联网 发布:unity3d click 编辑:程序博客网 时间:2024/06/05 12:02

策略模式作为一种对象行为型模式。将做一件事情的多条途径单独进行封装,不同的对象可以选择使用不同的途径来完成同一件事情。刚上来可能会懵,不要紧,往下看。

1、定义

定义一系列的算法,把它们一个一个封装起来,并且使他们可相互替换。本模式使得算法可独立于使用它的客户而变化。

2、代码示例

<?phpinterface IStrategy {    public function execute();}//策略Aclass ConcreteStrategyA implements IStrategy {    public function execute() {        echo "Called ConcreteStrategyA execute method\n";    }   }//策略Bclass ConcreteStrategyB implements IStrategy {    public function execute() {        echo "Called ConcreteStrategyB execute method\n";    }   }//策略Cclass ConcreteStrategyC implements IStrategy {    public function execute() {        echo "Called ConcreteStrategyC execute method\n";    }   }class Context {    var $strategy;     public function __construct(IStrategy $strategy) {        $this->strategy = $strategy;    }        public function execute() {        $this->strategy->execute();    }   } $a = new Context(new ConcreteStrategyA);$a->execute();

部分代码来源:http://zh.wikipedia.org/wiki/%E7%AD%96%E7%95%A5%E6%A8%A1%E5%BC%8F#PHP(稍做了修改)

3、策略模式初体验

其实策略模式就是说在做一件事情的时候可能有很多途径,比如快过年了,我们回家可以坐火车、飞机、汽车,也可以跟随摩托车大军骑摩托车或者开车。一条途径就是一种回家的策略。它们可以互相替换,都能完成回家这件事情。

那么我们回家这个该怎么写呢?【请务必要看懂上边那段简单的代码】

$zhansan = new Person(new GoHomeByTain());//张三坐火车回家$zhansan->goHome();$lisi = new Person(new GoHomeByCar()); //李四开车回家$lisi->goHome();

策略模式干了些什么呢?

就是简单地将做一件事情的很多途径,分别封装起来,然后通过接口来统一管理,这些事情每一个是一个策略,和具体对象没有关系,对象做这件事情,可以选择用不同的途径。

4、策略模式使用

当你闻到一些“代码的坏味道”的时候,比如Switch Statement/Switch声明,就需要用策略模式了。就是说如果你的代码里用到了switch,或者出现了大量的分支情况的时候就需要注意了。来看个例子,就是上边代码变坏的情况:

<?phpclass Context {    public function IStrategy($strategy){        /*$this->{$strategy}();*/ //这种写法和用switch是等效的。        switch($strategy){            case  "ConcreteStrategyA" :  $this->ConcreteStrategyA();break;            case  "ConcreteStrategyB" :  $this->ConcreteStrategyB();break;            default:break;        }    }           public function ConcreteStrategyA() {        echo "Called ConcreteStrategyA execute method\n";    }           public function ConcreteStrategyB() {        echo "Called ConcreteStrategyB execute method\n";    }   }   $a = new Context();$a->IStrategy("ConcreteStrategyA");
这段代码只作为演示,已经够丑陋了吧。用这段代码也能实现功能,但是会出现一些问题,比如一个是残疾,他也能随摩托车大军骑摩托车回家吗?显然这里的$a这个实例和行为的耦合太高了。如果你为了残疾人修改了骑摩托车这个行为,又会影响到正常人骑摩托车。

以上只是一个实例,总之,策略模式适用于以下情况:

1) 许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。

2) 需要使用一个算法的不同变体。

3) 算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。

4) 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。讲相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

5、策略模式总结

1) 抽象出各种相似行为的一个接口。

2) 定义各种行为。

3) 为对象提供指定行为和执行行为的入口。

0 0
原创粉丝点击