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) 为对象提供指定行为和执行行为的入口。
- PHP 设计模式 策略模式(Strategy)
- 设计模式----Strategy(策略)
- 设计模式--Strategy(策略)
- Strategy(策略)设计模式
- 设计模式----策略模式(Strategy)
- 设计模式--策略模式(Strategy)
- 设计模式C++(Strategy策略模式)
- 设计模式---策略模式(strategy)
- java 设计模式--策略模式(strategy)
- 【设计模式】之策略模式(Strategy)
- 设计模式之--策略模式(Strategy)
- 设计模式C++(Strategy策略模式)
- 设计模式(一)Strategy - 策略模式
- 设计模式之策略(strategy)模式
- 设计模式之策略模式(Strategy)
- 设计模式5--策略模式(Strategy)
- 设计模式-----策略模式(strategy)
- 浅学设计模式--策略(Strategy)模式
- php短址转换实现
- 狗刨学习网协同DataEye报道:手游玩家中女性用户比例占4成
- [Android初级]android与netty4初体验
- android findbugs一些常见的问题
- NotificationalLocal 本地推送
- PHP 设计模式 策略模式(Strategy)
- 淘宝联盟网站推广,验证域名失败
- Servlet(二)开发流程
- javafX8初探(分隔符)
- DevStore一键锁屏源码学习
- java学习--java多线程总结
- svc: failed to register lockdv1 RPC service (errno 111)解决和nfs配置
- perl特殊变量
- Java打jar包并运行实践