专栏首页Lemon黄PHP设计模式——策略模式

PHP设计模式——策略模式

定义一系列算法,封装每个算法,并使它们可互换。策略使算法独立于使用该算法的客户端而变化。

通勤是我们日常生活的一部分。每天,当我们离开家上班时,我们必须选择交通工具。作为通勤者,我们有很多选择,出租车,公共汽车或火车,这实际上取决于我们的心情和我们所处的状况。就像你出门时间来得很晚而赶时间一样,那么你可能会乘出租车 。在另外的某天,如果你有充足的时间并不在有没有座位,那么乘公共汽车是一个不错的选择。在我们想要确保我们准时到达某个位置而又不会遇到交通拥堵的麻烦的日子里,我们会坐火车。

这是一个策略模式的完美示例。

公共汽车,火车和出租车都是交通工具,但它们当然在许多方面有所不同。它们在成本上彼此不同,并且它们采用不同的路线将您带到目的地。它们是相同的,因为尽管旅行时间长短不一,但它们都是到达目的地的一种方式。他们都属于一个范畴,即运输。

我们首先来创建一个关于运输(Transportation)的接口:

interface  Transportation
{
     function transport(Passenger $passenger);
}

创建一个实现Transportation接口的Bus类:

class Bus implements Transportation
{
     public function transport(Passenger $passenger)
     {
         echo '通过路线A带你到达目的地';
     }
}

创建一个实现Transportation接口的Train类:

class Train implements Transportation
{
    public function transport(Passenger $passenger)
    {
        echo '通过路线B带你到达目的地';
    }
}

创建一个实现Transportation接口的Taxi类:

class Taxi implements Transportation
{
    public function transport(Passenger $passenger)
    {
        echo '通过路线C带你到达目的地';
    }
}

最后,我们需要创建一个乘客(Passenger)类来代表我们:

class Passenger
{
    private $_transportation = null;
 
    public function goToWork()
    {
        $this->_transportation->transport($this);
    }
 
    public function chooseTransport(Transportation $transportation)
    {
        $this->_transportation = $transportation;
    }
}

接下来我们来看看,乘客如何在上下文中使用不同的交通工具:

$john   = new Passenger();
$bus    = new Bus();
$train  = new Train();
$taxi   = new Taxi();
// 乘坐公交车
$john->chooseTransport($bus);
$john->goToWork();
// 乘坐火车
$john->chooseTransport($train);
$john->goToWork();
// 乘坐的士
$john->chooseTransport($taxi);
$john->goToWork();

公交车(Bus),火车(Train)和出租车(Taxi)的类与乘客(Passenger)的类有所不同,因为它们都实现了运输(Transportation)接口。

在我们的示例中,通过应用策略模式,我们定义了算法(公交车,火车和出租车)的范畴(运输范畴),封装了每个算法(Passenger乘客类仅知道运输(Transportation)接口),并使它们可互换(它们实现了通用接口) )。策略使算法独立于使用该算法的客户端(Passenger类)而变化。

本文分享自微信公众号 - Lemon黄(lemonhunag),作者:Lemon黄

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 简明PHP进阶【1-基于Window系统的开发环境】

    人活在世上有两大义务,一是好好做人,无愧于人生一世。这一条我还差的很远。另外一条是不能惯着别人的臭毛病,这一条我差的更远。

    Lemon黄
  • 基于Express的一个电影网站--Express介绍

    Express是一个基于Node.js平台的极简、灵活的Web应用开发框架,它通过了一系列强大的特性,帮助开发人员创建各种Web和移动设备应用。

    Lemon黄
  • 通俗易懂PHP基础【6-字符串常用函数】

    最糟糕的是人们在生活中经常受到错误志向的阻碍而不自知,真到摆脱了那些阻碍时才能明白过来。

    Lemon黄
  • 95后入行深度学习,都做出了哪些创意应用?

    如果用一个词形容现在的大学生,“创新”“富有创意”都很贴切,而大学生入行深度学习,可谓将创新发挥到了极致!

    用户1386409
  • 11.多线程、多进程和线程池编程

    RLock:在同一个线程里面,可以连续多次调用acquire,一定要注意acquire和release的次数相等

    zhang_derek
  • es 5 数组reduce方法记忆

    reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始合并,最终为一个值。 概念:对数组中的所有元素调用指定的回...

    蓓蕾心晴
  • Pandas 简介

    Pandas 是Python的数据处理包,全名:Python Data Analysis Library 是连接 SciPy 和 NumPy 的一种工具。特色...

    Linker
  • 【每天学点Python】案例六:判断密码

    py3study
  • 使用“数据驱动测试”之前应该知道的

    顾翔老师开发的bugreport2script开源了,希望大家多提建议。文件在https://github.com/xianggu625/bug2testscr...

    小老鼠
  • 【python】个人经验:如何写出兼容py2与py3的代码

    Python2已经停止维护,但由于历史原因,我们不得不在接下来的几年中,习惯两种语言依然共存的状况。 如果能习惯性地写出同时兼容py2与py3的代码,就可以减...

    JNingWei

扫码关注云+社区

领取腾讯云代金券