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

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

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

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值