<?php
header('Content-Type:text/html;charset=utf-8');
/**
* 策略模式演示代码
*
* 为了更好地突出“策略”,我们这里以出行为例演示,日常出行大概分为以下几种工具:自驾车,公交车,地铁,火车,飞机,轮船
* 结构:
* 抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
* 具体策略角色:包装了相关的算法和行为。
* 环境角色:持有一个策略类的引用,最终给客户端调用。
* 应用场景:
* 抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
* 具体策略角色:包装了相关的算法和行为。
* 环境角色:持有一个策略类的引用,最终给客户端调用。
* 步骤:
* 定义抽象角色类(定义好各个实现的共同抽象方法)
* 定义具体策略类(具体实现父类的共同方法)
* 定义环境角色类(接收保存实例,统一执行策略类接口方法)
*
* 下面一起看代码,领会何为策略模式
*/ /**
* Interface Travel 抽象策略角色
* 约定具体方法
*/
interface Travel
{
public function go();
} /**
* Class selfDriving 具体策略角色
* 自驾车
*/
class bySelfDriving implements Travel
{
public function go()
{
echo '我自己开着车出去玩<br>';
}
} /**
* Class byBus具体策略角色
* 乘公交
*/
class byBus implements Travel {
public function go()
{
echo '我乘公交出去玩<br>';
}
} /**
* Class byMetro 具体策略角色
* 乘地铁
*/
class byMetro implements Travel
{
public function go()
{
echo '我乘地铁出去玩<br>';
}
} /**
* Class byTrain 具体策略角色
* 乘火车
*/
class byTrain implements Travel
{
public function go()
{
echo '我乘火车出去玩<br>';
}
} /**
* Class byAirplane 具体策略角色
* 乘飞机
*/
class byAirplane implements Travel
{
public function go()
{
echo '我乘飞机出去玩<br>';
}
} /**
* Class bySteamship 具体策略角色
* 乘轮船
*/
class bySteamship implements Travel
{
public function go()
{
echo '我乘轮船出去玩<br>';
}
} /**
* Class Mine 环境角色
*/
class Mine{
private $_strategy;
private $_isChange = false; /**
* 构造方法
* 此处使用到了依赖注入和类型约束的概念,详情请参考
*
* @param Travel $travel
*/
public function __construct(Travel $travel)
{
$this->_strategy = $travel;
} /**
* 改变出行方式
*
* @param Travel $travel
*/
public function change(Travel $travel)
{
$this->_strategy = $travel;
$this->_isChange = true;
} public function goTravel()
{
if ($this->_isChange) {
echo '现在改变主意,';
$this->_strategy->go();
} else {
$this->_strategy->go();
} }
} /**
* 客户端使用
*/
$strategy = new Mine(new byBus());
// 乘公交
$strategy->goTravel();
// 乘地铁
$strategy->change(new byMetro());
$strategy->goTravel();
// 自驾车
$strategy->change(new bySelfDriving());
$strategy->goTravel(); //打印:
//我乘公交出去玩
//现在改变主意,我乘地铁出去玩
//现在改变主意,我自己开着车出去玩

php 设计模式之策略者模式的更多相关文章

  1. HeadFirst设计模式(一)策略者模式

    最近在看HeadFirst设计模式一书,作为一个半路出家的程序员,感觉很多东西需要学习,学习的路程中有些东西学了当时觉得理解了,但日常工作中没有使用到渐渐的自己就忘记了.--------------- ...

  2. C#设计模式(20)——策略者模式(Stragety Pattern)

    一.引言 前面主题介绍的状态模式是对某个对象状态的抽象,而本文要介绍的策略模式也就是对策略进行抽象,策略的意思就是方法,所以也就是对方法的抽象,下面具体分享下我对策略模式的理解. 二.策略者模式介绍 ...

  3. c#设计模式之策略者模式(Strategy Pattern)

    场景出发 假设存在如下游戏场景: 1:角色可以装备木剑,铁剑,魔剑3种装备,分别对怪物造成20HP,50HP,100HP伤害(未佩戴装备则无法攻击); 2角色可以向怪物攻击,一次攻击后损失角色所佩戴装 ...

  4. JAVA设计模式--strategy(策略者模式)

    概念策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.(原文:The Strategy Pattern defines a fa ...

  5. C++设计模式实现--策略(Strategy)模式

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/L_Andy/article/details/30489331 一. 举例说明 曾经做了一个程序,程序 ...

  6. C#设计模式:策略者模式(Stragety Pattern)

    一,什么是策略模式? 1,针对同一命令或行为,不同的策略做不同的动作. 2,比如针对一组算法,将每个算法封装到具有公共接口的独立的类中,从而使它们可以相互替换.策略模式使得算法可以在不影响到客户端的情 ...

  7. Head First 设计模式 - 01. 策略 (Strategy) 模式

    当涉及到"维护"时,为了"复用"目的而使用继承,结局并不完美 P4 对父类代码进行修改时,影响层面可能会很大 思考题 利用继承来提供 Duck 的行为,这会导致 ...

  8. 设计模式:策略模式(Strategy)

    定   义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...

  9. PHP设计模式之策略模式

    前提: 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查 找.排序等,一种常用的方法是硬编码(Hard Cod ...

随机推荐

  1. R 读取excel的方法

    1.加载 readxl 包,利用 reade_excel() 函数 install.packages("readxl") library(readxl) data = read_e ...

  2. SQL decode 函数的用法

    decode 函数基本语法: decode(字段|表达式,条件1,结果1,条件2,结果2,...,条件n,结果n,缺省值): --缺省值可以省略 表示如果 字段|表达式 等于 条件1 时,DECODE ...

  3. CF1141D Colored Boots

    There are n left boots and n right boots. Each boot has a color which is denoted as a lowercase Lati ...

  4. bat 卸载程序的脚本

    @echo off :: BatchGotAdmin :------------------------------------- REM --> Check for permissions & ...

  5. 使用node.js安装asar和反编译app.asar

    背景:app.asar文件是Electron加密打包时的中间产物,electron.exe调用resources文件夹下的app.asar从而实现不用解压缩而直接读取文件内容的高效. 一.需要先安装n ...

  6. Java UDP发送与接收

    IP地址?端口号?主机名? 什么是Socket? 什么是UDP? 什么是TCP? UDP和TCP区别? 以上问题请自行百度,有标准解释,此处不再赘述,直接上干货! 实例: 发送端: public cl ...

  7. javascript实现抽奖程序

    昨天开年会的时候看到一个段子说唯品会年会抽奖,结果大奖都被写抽奖程序的部门得了,CTO现场review代码. 简单想了一下抽奖程序的实现,花了十几分钟写了一下,主要用到的知识有数组添加删除,以及ES5 ...

  8. PAT Advanced 1018 Public Bike Management (30) [Dijkstra算法 + DFS]

    题目 There is a public bike service in Hangzhou City which provides great convenience to the tourists ...

  9. ArchLinux安装KDE桌面

    ArchLinux安装KDE桌面 一.链接网络 1.有线 # dhcpcd 2.无线 # wifi-menu 3.检查 # ping www.baidu.com 二.安装X服务 # pacman -S ...

  10. 查询内核符号链接的信息的API

    NtOpenSymbolicLinkObject和NtQuerySymbolicLinkObject获取指定符号链接的信息 版权声明:本文为博主原创文章,未经博主允许不得转载.