设计模式---策略模式Strategy(对象行为型)

1. 概述

  策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

  策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。

2. 应用场景

  (1)多个类只区别在表现行为不同,在运行时动态选择具体要执行的行为。

  (2)需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。

  (3)对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

3. 示例

  出行旅游:我们可以有几个策略可以考虑:可以骑自行车、汽车、火车、飞机。每个策略都可以得到相同的结果,但是它们使用不同的资源。选择策略的依据是费用、时间、方便程度。

 1 <?php
2 /**
3 * 策略模式
4 * 定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化
5 *
6 */
7
8
9 /**
10 * 出行旅游
11 *
12 *
13 */
14 interface TravelStrategy{
15 public function travelAlgorithm();
16 }
17
18
19 /**
20 * 具体策略类(ConcreteStrategy)1:乘坐飞机
21 */
22 class AirPlanelStrategy implements TravelStrategy {
23 public function travelAlgorithm(){
24 echo "travel by AirPlain", "<BR>\r\n";
25 }
26 }
27
28
29 /**
30 * 具体策略类(ConcreteStrategy)2:乘坐火车
31 */
32 class TrainStrategy implements TravelStrategy {
33 public function travelAlgorithm(){
34 echo "travel by Train", "<BR>\r\n";
35 }
36 }
37
38 /**
39 * 具体策略类(ConcreteStrategy)3:骑自行车
40 */
41 class BicycleStrategy implements TravelStrategy {
42 public function travelAlgorithm(){
43 echo "travel by Bicycle", "<BR>\r\n";
44 }
45 }
46
47
48
49 /**
50 *
51 * 环境类(Context):用一个ConcreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。
52 * 算法解决类,以提供客户选择使用何种解决方案:
53 */
54 class PersonContext{
55 private $_strategy = null;
56
57 public function __construct(TravelStrategy $travel){
58 $this->_strategy = $travel;
59 }
60 /**
61 * 旅行
62 */
63 public function setTravelStrategy(TravelStrategy $travel){
64 $this->_strategy = $travel;
65 }
66 /**
67 * 旅行
68 */
69 public function travel(){
70 return $this->_strategy ->travelAlgorithm();
71 }
72 }
73
74 // 乘坐火车旅行
75 $person = new PersonContext(new TrainStrategy());
76 $person->travel();
77
78 // 改骑自行车
79 $person->setTravelStrategy(new BicycleStrategy());
80 $person->travel();
81
82 ?>

设计模式---策略模式Strategy(对象行为型)

时间: 2024-10-27 13:37:23

设计模式---策略模式Strategy(对象行为型)的相关文章

策略模式(Strategy)——对象行为型模式

策略模式的意图: 定义一系列的算法,把它们一个个的封装起来,并且使它们可以互相替换.本模式使算法可以独立于使用它的客户而变化. 该模式具有以下特征: 1.完成一件事不止有一种可以选择的方法,或者虽然现在是唯一的,但预期会不断改进或需要"备胎". 2.各方法视图解决的是同一件事. 3.每个方法是独立于其它方法的. 4.方法的取舍因时.因势.因人而异,临场处置时择优选择一个. 策略模式的结构图如下: Strategy(策略):定义所有支持的算法的公共接口.Context使用这个接口来调用某

说说设计模式~策略模式(Strategy)

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.而对于客户端(UI)来说,可以通过IOC再配合工厂模块,实现动态策略的切换,策略模块通常于一个抽象策略对象(interface or abstract class),多个具体策略对象(implement class )和一个调用策略的入口组成. 何时能用到它? 对于UI来说,可能一个功能会有多种实现方式,而且实现方式可能还会有扩展,例如,一个ATM机,它目前支持工行,建行,家行,以后可能又出现了占占银行,而这时,ATM

设计模式 - 策略模式(Strategy Pattern) 具体解释

策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全部, 禁止转载, 如有须要, 请站内联系. 策略模式: 定义了算法族, 分别封装起来, 让它们之间能够相互替换, 此模式让算法的变化独立于使用算法的客户. 对于父类的子类族须要常常扩展新的功能, 为了使用父类比較灵活的加入子类, 把父类的行为写成接口(interface)的形式; 使用set()方法

设计模式 - 策略模式(Strategy Pattern) 详解

策略模式(Strategy Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权所有, 禁止转载, 如有需要, 请站内联系. 策略模式: 定义了算法族, 分别封装起来, 让它们之间可以相互替换, 此模式让算法的变化独立于使用算法的客户. 对于父类的子类族需要经常扩展新的功能, 为了使用父类比较灵活的添加子类, 把父类的行为写成接口(interface)的形式; 使用set()方法,

设计模式--策略模式(strategy)

1.策略模式(strategy ['stræt?d?i]) 我的理解是:方案候选模式 (反正关键就是有很多的候选,哈哈) 看了很多例子,都是在说鸭子的,那个例子很好,然后我就照葫芦画瓢了, 他们生产鸭子,我们就制造人 所以,父类 Person类就出来了 1 public abstract class Person { 2 //唱歌可就不一样了,唱法不同,唱功不同:而且哑巴不能唱歌 3 public void singing(){ 4 System.out.println("我要唱歌")

设计模式-策略模式Strategy以及消灭if else

概述 如果在开发过程中,出现大量的if else或者switch case 语句,如果这些语句块中的代码并不是包含业务逻辑,只是单纯的分流方法,那么,每一个语句块中都是一个算法或者叫策略. 背景 比如在最近项目中遇到的问题.一个二维码字符串解析的方法: 微信的二维码扫描结果包含"WeChat",解析规则是拿着文本到微信服务器解析,返回解析对象. 支付宝二维码扫描结果包含"Alipay",解析规则是使用"->"分割字符串得到解析对象. 最简单

设计模式---策略模式Strategy Pattern

策略模式 定义:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 问题:有一个鸭子类定义了鸭子的种种行为,包括swim(),quack(),fly(),但是,并不是所有的鸭子都会飞行(fly)或者叫(quack),在这里,我们认为所有的鸭子都会浮在水面上(swim).如何实现各种不同的鸭子的不同的表现. 解决方法:第一个想到的会使继承,在鸭子父类中定义好所有的方法,在实现鸭子子类的过程中,对不满足于具体的鸭子的行为进行覆盖,但是在这种方法

设计模式---策略模式(Strategy Pattern)

先说几个例子,让大家对策略模式有个感性的认识:比如玩RPG游戏时,一个人物可以拥有多种武器,但是攻击时只能使用一把武器,切换武器的过程其实就是一个策略模式的应用. 故事案例:鸭子很多种(活生生的鸭子,橡皮鸭,模型鸭,木头鸭...),共性是可以swim,display(即给别人看),活生生的鸭子可以嘎嘎叫,橡皮鸭子可以吱吱叫,模型鸭可以飞,木头鸭什么特别之处都没有,那我们怎么处理这个问题呢? 思路一:鸭子作为一个抽象类(Duck),然后这些具体的鸭子就继承他,并重新新增一些自己特有的方法.(好像感

设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕该功能.如查找.排序等,一种经常使用的方法是硬编码(Hard Coding)在一个类中,如须要提供多种查找算法,能够将这些算法写到一个类中,在该类中提供多个方法,每个方法相应一个详细的查找算法:当然也能够将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件推断语句来进行选择.