您的位置:首页 > 编程语言 > PHP开发

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

2015-02-10 14:14 288 查看

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

1、定义

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

2、代码示例

<?php
interface IStrategy {
public function execute();
}

//策略A
class ConcreteStrategyA implements IStrategy {
public function execute() {
echo "Called ConcreteStrategyA execute method\n";
}
}

//策略B
class ConcreteStrategyB implements IStrategy {
public function execute() {
echo "Called ConcreteStrategyB execute method\n";
}
}

//策略C
class 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,或者出现了大量的分支情况的时候就需要注意了。来看个例子,就是上边代码变坏的情况:

<?php

class 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) 为对象提供指定行为和执行行为的入口。

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: