php策略模式,PHP设计模式-策略模式-程序员宅基地

技术标签: php策略模式  

定义

策略模式 定义了算法族,并分别封装起来,让它们之间可以相互替换,让算法的变化独立于使用算法的客户

优点

策略模式提供了管理相关的算法族的办法

策略模式提供了可以替换继承关系的办法 将算封闭在独立的策略类中使得你可以独立于其客户改变它

使用策略模式可以避免使用多重条件转移语句。

缺点

客户必须了解所有的策略 这是策略模式一个潜在的缺点

算法族和客户之间的通信开销

策略模式会造成很多的策略类

鸭子类图

%5B<<Interface>>;FlyBehavior;fly()%5D%5E-.-%5BFlyWithWings%7Cfly()%5D,%5B<<Interface>>;FlyBehavior;fly()%5D%5E-.-%5BNoFly%7Cfly()%5D,%5B<<Interface>>;QuackBehavior;quack()%5D%5E-.-%5BQuack%7Cquack()%5D,%5B<<Interface>>;QuackBehavior;quack()%5D%5E-.-%5BSqueak%7Cquack()%5D,%5B<<Abstract>>;Duck%5D++->%5B<<Interface>>;FlyBehavior;fly()%5D,%5B<<Abstract>>;Duck%5D++->%5B<<Interface>>;QuackBehavior;quack()%5D,%5B<<Abstract>>;Duck%5D%5E-%5BMallardDuck%5D,%5B<<Abstract>>;Duck%5D%5E-%5BRubber%5D

鸭子实例

飞行

//飞行接口

interface FlyBehavior

{

public function fly();

}

//会飞

class FlyWithWings implements FlyBehavior

{

public function fly()

{

echo "用翅膀飞";

}

}

//不会飞

class FlyNoWay implements FlyBehavior

{

public function fly()

{

echo "我不会飞";

}

}

//叫接口

interface QuackBehavior

{

public function quack();

}

//呱呱叫

class Quack implements QuackBehavior

{

public function quack()

{

echo "呱呱叫";

}

}

//吱吱叫

class Squeak implements QuackBehavior

{

public function quack()

{

echo "吱吱叫";

}

}

鸭子类

abstract class Duck

{

private flyBehavior;

private quackBehavior;

public abstract function display();

public function setFlyBehavior(FlyBehavior $flyBehavior)

{

$this->flyBehavior = $flyBehavior;

}

public function setQuackBehavior(QuackBehavior $quackBehavior)

{

$this->quackBehavior = $quackBehavior;

}

public function performFly()

{

$this->flyBehavior->fly();

}

public functioin performQuack()

{

$this->quackBehavior->quack();

}

}

class MallardDuck extends Duck

{

public function display()

{

echo "我是一只Mallard鸭子";

}

}

测试

$fly = new FlyWithWings();

$quack = new Quack();

$mallardDuck = new MallardDuck();

$mallardDuck->setFlyBehavior($fly);

$mallardDuck->setQuackBehavior($quack);

$mallardDuck->performFly();

$mallardDuck->performQuack();

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_35729227/article/details/115538882

智能推荐

android 微信绑定银行卡号,android 仿微信添加银行卡时输入支付密码-程序员宅基地

文章浏览阅读176次。最近了解到了BottomSheetBehavior,感觉是个很有意思的布局,刚好项目中有实际场景可以应用,就拿它来实现了,下面是我们要实现的最终效果:gif.gif底部的键盘布局呢,就是采用的BottomSheetBehavior,我个人理解类似于抽屉的效果,可以从底部滑出划入,话不多说,开始吧。布局界面代码布局界面就是一个关闭按钮的图片,两个TextView和一个自定义的密码输入控件,下面贴上代...

dp对计算机科学的重要性,社会科学技术在计算机领域对社会发展作用及影响.pdf...-程序员宅基地

文章浏览阅读198次。科学技术在计算机领域对社会发展的作用及影响摘要:从人类进入工业文明以来,科学技术迅速发展,极大地促进了生产力的发展和社会变革。科学技术是生产力,科学是最高意义上的革命力量,技术是人类改造自然、进行生产的方法和手段,科学和技术是辩证统一的整体,对推动社会发展有着非常重要的意义。本文将结合科学技术在计算机领域的发展介绍其在社会发展的作用及影响。关键词:科学 技术 计算机领域 社会发展 生产力 经济 影..._计算机dp领域

多指触摸处理_motionevent 多指判断-程序员宅基地

文章浏览阅读430次。一.前言在开发中,我们经常会使用自定义View进行拖动和缩放,拖动一般是单指触摸,但是实际情况我们也可以使用多指进行触摸移动,如果这是我们进行抬起二.了解触摸事件2.1 了解MotionEvent中手指的index和id在MotionEvent中,存储了每个手指的index和id:Index: 每个MotionEvent在数组中存储了手指的信息,index表示手指在数组中的位置,开发中我们也是通过index作为参数来获取相关信息,比如event.getX(int pointerIndex),ev_motionevent 多指判断

OSG开发环境搭建-程序员宅基地

文章浏览阅读3k次。国庆出去了几天,今天有点时间,把上次承诺要写的osgNeHe环境搭建过程写一下,方便还不熟悉的朋友们。安装准备进行osg的开发需要安装如下的一些软件:Visual Studio 2008或者更高版本(其他版本也可以,但是考虑到Qt需要自己编译有点麻烦,建议使用VS08以上版本)Qt 4.8系列(Qt5也可以,本文以4.8系列为例)CMake 2.8.12或更高版本O

IDEA启动时自动报Plugin Error错误-程序员宅基地

文章浏览阅读190次。Plugin Error Problems found loading plugins: Plugin "JBoss Integration" was not loaded: required plugin "Java EE: EJB, JPA, Servlets" is disabled. Plugin "Jetty Integratio..._pluginexception cannot laod class urswolfer idea

jquery easyUi简单介绍-程序员宅基地

文章浏览阅读54次。jquery easyui 下称(ui)适合一个网站后台的快速搭建,给我们开发人员节约了很多的时间,下面,对于操作,下面进行详细的介绍下:首先下载ui包,下载地址http://www.jeasyui.com/download/index.php选择一个版本下载,当然不同版本存在差异,建议使用最新版本然后可以开始我们的项目开发了我们新建一个html页面,将ui包解压到本地硬盘,...

随便推点

MATLAB中unzip出错,UNZIP命令出错END-OF-CENTRAL-DIRECTORY SIGNATURE NOT FOUND-程序员宅基地

文章浏览阅读820次。data.zip文件有4G多,解压的时候出问题了.Archive: data.zipEnd-of-central-directory signature not found. Either this file is nota zipfile, or it constitutes one disk of a multi-part archive. In thelatter case the cent..._matlab运行unzip报错

ls与linux文件属性_联合属性ls-程序员宅基地

文章浏览阅读1.1k次。ls与文件属性ls:代表list,显示文件的文件名与相关属性选项: -a:列出所有的文件及目录的详细权限及属性 -l:每个文件用单行输出 -d:仅显示目录名 其他的用到时再补充 如图所示,为用ls -l列出的文件属性,共有七列,下面将逐一介绍每列的含义: 第一列:文件的类型与权限。共10个字符。 第一个字符:代表这个文件的属性–目录、文件或链接文件 d:目录 -:文件..._联合属性ls

mips架构linux启动分析(四)(接收bios信息和环境初始化)_prom_init-程序员宅基地

文章浏览阅读1.2k次。老样子先看函数把.void __init prom_init(void){//初始化命令 prom_init_cmdline();//初始化环境 prom_init_env();//这里所作的是把桥片进行了一些配置 if (loongson_pch) loongson_pch->early_config();#ifdef CONFIG_NUMA prom_init_n_prom_init

Vue v-show/v-if绑定的数据改变时,无法监听数据变化_vue3 v-if监听不到数据变化-程序员宅基地

文章浏览阅读1.4w次。原因:向对象中新增属性时,Vue无法监听新增的属性的数据变化,从而无法触发视图的改变 解决:使用 Vue.set() 来新增属性Vue.set( target, key, value ) 参数: {Object | Array} target {string | number} key {any} value 返回值:设置的值。 ..._vue3 v-if监听不到数据变化

pyqt生成 android,PyQt on Android-程序员宅基地

文章浏览阅读2.1k次。问题I'm working on PyQt now, and I have to create the application on Android, I've seen the kivy library, but it's too crude.Is there any way now to run an application on Android made on PyQt?回答1:Androi..._pyqt android

发现一个 硬件模组公司 espressif ,有好多开源项目 arduino 开发_espressif开源社区建设经验-程序员宅基地

文章浏览阅读2.4k次。前言本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/88837335未经博主允许不得转载。博主地址是:http://blog.csdn.net/freewebsys1,关于espressif乐鑫是一家全球化的物联网领域核心芯片公司,我们致力于前沿低功耗 Wi-Fi+蓝牙双模物联网解决方案的研发,现已推出了深受全球开..._espressif开源社区建设经验

推荐文章

热门文章

相关标签