<?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. kNN.py源码及注释(python3.x)

    import numpy as npimport operatorfrom os import listdirdef CerateDataSet():        group = np.array( ...

  2. 130-PHP子类通过类函数访问父类protected修饰的类成员

    <?php class father{ //定义father类 //定义protected修饰的成员属性和方法 protected $money=1000000; protected funct ...

  3. idea新建maven web项目

    一.新建maven web项目 二.配置服务器 三.测试运行

  4. 最小生成树(Kruskal+Prim)--模板

    最小生成树-----在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树. 应用场景 1.假设以下情景,有一块木板,板上钉上了一些钉子,这些钉子可以由一些细绳连接起来.假设每个钉子可以通 ...

  5. Object.keys(),Object.values(),Object.entries()

    (1)Object.keys() //       返回数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键名. eg:var obj = {a:1,b:'gy'} Ob ...

  6. vue学习(十二)vue全家桶 Vue-router&Vuex

    一 vue-router的安装 二 vue-router的基本使用 三 命名路由 四 动态路由的匹配和路由组件的复用 一 vue-router的安装 NPM npm install vue-route ...

  7. 【剑指Offer】面试题05.替换空格

    题目 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 示例 1: 输入:s = "We are happy." 输出:"We%20are ...

  8. UVA - 1647 Computer Transformation(计算机变换)(找规律)

    题意:初始串为一个1,每一步会将每个0改成10,每个1改成01,因此1会依次变成01,1001,01101001,……输入n(n<=1000),统计n步之后得到的串中,"00" ...

  9. mybatis中实体类跟数据库属性不一致解决方案

    1.在Mapper.xml映射配置文件中给sql语句起别名 select id as uid,username as name from user 2.mybatis中可以单独的配置查询结果的列名和实 ...

  10. DFS+BFS(广度优先搜索弥补深度优先搜索遍历漏洞求合格条件总数)--09--DFS+BFS--蓝桥杯剪邮票

    题目描述 如下图, 有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连)  比如,下面两张图中,粉红色所示部分就是合格的剪取.  请你计算,一共有多少 ...