php设计模式课程---6、策略模式如何使用
php设计模式课程---6、策略模式如何使用
一、总结
一句话总结:比如代码需求,做一饭店,有南北方不同菜系,不同分店有不同的饭菜汤的需求,代码怎么设计
从饭店有特色过渡到厨师有特色(南方厨师(南方饭,南方菜,南方汤),北方厨师(北方饭,北方菜,北方汤))
利用厨师的组合实现饭店有不同特色(满足不同分店的需求)
1、传入的参数是对象,执行对象的方法如何实现?
就是普通的->执行方法: return $this->fanCreateor->fan();
83 class FD {
84 protected $fanCreateor = null;
85 protected $caiCreateor = null;
86 protected $tangCreateor = null;
87
88 public function __construct($f,$c,$t) {
89 $this->fanCreateor = $f;
90 $this->caiCreateor = $c;
91 $this->tangCreateor = $t;
92 }
93
94 public function createFan() {
95 return $this->fanCreateor->fan();
96 }
97
98 public function createCai() {
99 return $this->caiCreateor->cai();
100 }
101
102 public function createTang() {
103 return $this->tangCreateor->tang();
104 }
105 }
106
107
108 $fd = new FD(new NorthCook() , new NorthCook() , new SouthCook);
2、编程的灵活性原则?
有什么 比 是什么 更灵活
组合 比 继承更灵活
二、策略模式如何使用
1、代码
<?php
/*
// 做一饭店
class FanDian {
public function fan() {
return '面条';
} public function cai() {
return '炒菜';
} public function tang() {
return '蛋花汤';
}
} class SouthDian {
public function fan() {
return '大米饭';
} public function cai() {
return '烧菜+奶油';
} public function tang() {
return '海鲜汤';
}
} class BjDian {
public function fan() {
return '大米饭';
} public function cai() {
return '炒菜';
} public function tang() {
return null;
}
} $fd = new FanDian();
echo $fd->tang(); */ class NorthCook {
public function fan() {
return '面条';
} public function cai() {
return '炒菜';
} public function tang() {
return '蛋花汤';
}
} class SouthCook {
public function fan() {
return '米饭';
} public function cai() {
return '烧菜+奶油';
} public function tang() {
return '海鲜汤';
}
} class FD {
protected $fanCreateor = null;
protected $caiCreateor = null;
protected $tangCreateor = null; public function __construct($f,$c,$t) {
$this->fanCreateor = $f;
$this->caiCreateor = $c;
$this->tangCreateor = $t;
} public function createFan() {
return $this->fanCreateor->fan();
} public function createCai() {
return $this->caiCreateor->cai();
} public function createTang() {
return $this->tangCreateor->tang();
}
} $fd = new FD(new NorthCook() , new NorthCook() , new SouthCook); echo $fd->createFan() , "<br>";
echo $fd->createTang() , "<br />"; ?>
php设计模式课程---6、策略模式如何使用的更多相关文章
- 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...
- 《Head First 设计模式》[01] 策略模式
<Head First 设计模式>(点击查看详情) 1.写在前面的话 之前在列书单的时候,看网友对于设计模式的推荐里说,设计模式的书类别都大同小异,于是自己就选择了Head First系列 ...
- javascript设计模式--策略模式
javascript策略模式总结 1.什么是策略模式? 策略模式的定义是:定义一系列的算法,把他们独立封装起来,并且可以相互替换. 例如我们需要写一段代码来计算员工的奖金.当绩效为a时,奖金为工资的5 ...
- [head first 设计模式] 第一章 策略模式
[head first 设计模式] 第一章 策略模式 让我们先从一个简单的鸭子模拟器开始讲起. 假设有个简单的鸭子模拟器,游戏中会出现各种鸭子,此系统的原始设计如下,设计了一个鸭子超类,并让各种鸭子继 ...
- Python设计模式: 最佳的"策略"模式实践代码
Python设计模式: 最佳的"策略"模式实践代码 今天抽空看了下流畅的python,发现里面介绍了不少python自带的库的使用实例,用起来非常的优雅. 平时用Python来写爬 ...
- [设计模式] javascript 之 策略模式
策略模式说明 定义: 封装一系列的算法,使得他们之间可以相互替换,本模式使用算法独立于使用它的客户的变化. 说明:策略模式,是一种组织算法的模式,核心不在于算法,而在于组织一系列的算法,并且如何去使用 ...
- 设计模式:Strategy 策略模式 -- 行为型
设计模式 策略模式Strategy(对象行为型) 这是几年前写的文字(转载做的笔记更准确些),发觉还是废话多了点. 其实,核心就是5.结构中的UML图 5.1 和 5.2(新增).现在看这张图就觉得一 ...
- 设计模式浅谈----策略模式(c#及java实现)
一.何为策略模式 策略模式是行为型模式的一种,主要用于需要使用不同的算法来处理不同的数据对象时使用,是一种可以在运行时选择算法的设计模式.也称为政策模式. 主要解决:在有多种算法相似的情况下,使用 i ...
- JavaScript设计模式 Item 7 --策略模式Strategy
1.策略模式的定义 何为策略?比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但是不在乎钱,可以选择坐飞机. 如果没有钱,可以选择坐大巴或者火车. 如果再穷一点,可以选 ...
随机推荐
- 小白学习HTTPS
如果你和我一样是HTTPS的小白的话,那就一起来学习这个吧.争取把这篇博客写好,写全面,从原理到实践再到部署. 让我们先来模拟一个场景:当你嗨皮地敲着代码,你的老板偷偷摸摸跑到你的身边,"小 ...
- MapReduce源码分析之JobSplitWriter
JobSplitWriter被作业客户端用于写分片相关文件,包括分片数据文件job.split和分片元数据信息文件job.splitmetainfo.它有两个静态成员变量,如下: // 分片版本,当前 ...
- Java集合系列之TreeMap源代码分析
一.概述 TreeMap是基于红黑树实现的.因为TreeMap实现了java.util.sortMap接口,集合中的映射关系是具有一定顺序的,该映射依据其键的自然顺序进行排序或者依据创建映射时提供的C ...
- git学习之安装(二)
安装Git 最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑.不过,慢慢地有人把它移植到了Windows上.现在,Git可以在Linux.Unix.Mac和 ...
- 多媒体开发之rtp 打包发流---udp 丢包问题
http://blog.csdn.net/acs713/article/details/19339707
- 多媒体开发之---h264格式slice_header
从Slice_Header学习H.264 写在前面: $ H.264我是结合标准和毕厚杰的书一块学的.看句法语义时最是头疼,一大堆的元素,很需要耐心.标准中在介绍某个元素的语义时,经常会突然冒 ...
- python 迭代器,生成器与推导式
函数的动态传参 *args 动态接收所有位置参数 **kwargs 动态接收关键字参数 顺序: 位置参数, *args, 默认参数, **kwargs def func(*args, **kwargs ...
- 单向HASH——MurmurHash
//seed 是大质数unsigned long long MurmurHash64B ( const void * key, int len, unsigned int seed ) { const ...
- java中业务接口
今天写完业务层在抽取接口的时候脑子里突然产生了一个问题:抽取接口到底有什么用呢? 在刚刚学习接口的时候知道接口是为了实现java的多继承,但是现在每一个业务类都要抽取一个接口,每当该类需要增加方法的时 ...
- 【python】-- Redis简介、命令、示例
Redis简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化 ...