<?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. laravel.01.一些细节

    0:参考1,参考2,参考3,参考4,参考5 1.读取项目的配置文件内容,比如app.php下的name属性,用config('app.name','default-value'); 2.读取.ENV文 ...

  2. 138-PHP static后期静态绑定(一)

    <?php class test{ //创建test类 public function __construct(){ self::getinfo(); //后期静态绑定 } public sta ...

  3. oracle11g导出dmp文件时不能导出空表,导致缺表

    一.执行 select 'analyze table '||table_name||' compute statistics;' from user_tables; 将该查询语句查询到的结果粘贴到sq ...

  4. SPOJ DQUERY D-query 离线+树状数组

    本来是想找个主席树的题目来练一下的,这个题目虽说可以用主席树做,但是用这个方法感觉更加叼炸天 第一次做这种离线方法,所谓离线,就在把所有询问先存贮起来,预处理之后再一个一个操作 像这个题目,每个操作要 ...

  5. 六、React 键盘事件 表单事件 事件对象以及React中的ref获取dom节点 、React实现类似Vue的双向数据绑定

    接:https://www.cnblogs.com/chenxi188/p/11782349.html 事件对象 .键盘事件. 表单事件 .ref获取dom节点.React实现类似vue双向数据绑定 ...

  6. 吴裕雄--天生自然C++语言学习笔记:C++ 接口(抽象类)

    接口描述了类的行为和功能,而不需要完成类的特定实现. C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念. 如果类中至少有一个函数被声明为纯虚 ...

  7. Elasticsearch 过滤

    章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...

  8. springmvc无法访问JS,CSS等文件

    配置好web.xml中的dispatchservlet后,js,css,都不能正常显示 web.xml配置文件 <!-- 核心控制器 --> <servlet> <ser ...

  9. bzoj 1832: [AHOI2008]聚会

    良心题2333 三个点两两求一遍就行,最小肯定是在某2个点的lca处,(肯定让第三个人去找2个人,不能让2个人一起去找第三个人233) #include<bits/stdc++.h> #d ...

  10. bzoj 4318OSU!

    和tyvj的Easy一样吧(然而还是不会2333) 期望是不能直接平方的(涨姿势),所以,,呵呵 #include<bits/stdc++.h> #define inf 0x7ffffff ...