设计模式的引入--策略模式

  

以一个有关鸭子的电子游戏“SimUDuck”开始,初始设计为

这时,有了一个新的需求,需要让鸭子可以飞

  第一次设计:(在父类Duck上加一个fly方法,此时所有子类都继承该方法)

然而,经理在演示该项目时,用的是橡胶鸭子,并表示橡胶鸭子不应该会飞(忧伤的程序员。)

该怎么解决这个问题呢?(给一个父类增加了方法,可是部分子类不需要该方法,甚至是不能有该方法)

  第二次设计:(增加Flyable接口和Quackable接口,让有需要的鸭实现该接口)

的确这样设计解决我们之前的问题,每个鸭子都有自己所需要的方法,可同时该方法造成了代码冗余,违背了DRY原则

该怎么解决这个问题呢?(每个子类都需要实现接口,导致各子类间代码重复冗余)

  第三次设计:(对接口进行不同的实现,此时Duck类不在继承或者实现接口,而是在类中实例化一个对象,此时,Duck类与Fly和Quack之间将不存在继承关系,解决了第一次设计的问题,同时因为已经对Fly接口进行实现,Duck类不在需要自己实现Fly接口,解决了第二次设计的问题)

代码(Duck抽象类,定义接口类型):

同时,增加set方法(可动态改变)

在Duck的子类中,对接口进行实例化

总结:

1. 将应用中可能需要变化的地方独立出来,不要和那些不需要变化的代码混在一起 {

  如例子中的fly方法,因为存在变化性,就不要和类似于display方法这样的固定刚需方法混在一起

}

2. 针对接口编程,而不是针对实现编程 {

  如例子中,不是由Duck类来实现Fly接口,而是我们新建FlyXX类来实现Fly接口,这样,鸭子的行为作为独立类,而不是由Duck父类来具体实现(设计1),或者继承某个接口后由子类实现(设计2),这样鸭子的行为就不会被绑死在Duck类上

}

3. 多用组合,少用继承 {

  在例子中,组合即是Duck类与Fly等行为类结合起来使用,使用组合建立系统能有很大的弹性,更可以在运行时动态改变行为

}

4. 上述例子的改写过程,用的便是策略模式 {

  策略模式定义了一系列的算法(例子中的Fly和Quack行为都属于算法),分别封装起来,让他们之间可以互相替换,使算法的变化独立于使用算法的客户(例子中Duck类与Fly等行为类将不会因为继承关系互相影响)

}

当然,策略模式也有缺点:

1. 客户端需要知道所有策略类

2. 策略模式会生成很多策略类

时间: 2024-08-11 17:58:18

设计模式的引入--策略模式的相关文章

设计模式-行为型-策略模式

策略模式(Strategy): 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理.策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类.用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”. 策略模式的角色: 1)环境类(Context):采用组合或聚合的方式维护一个对Strategy对象的引用. 2)抽象策略类(Strategy):定义所有支持的算法的公共接口.Context使用这个接口来调用某Concret

设计模式进阶(一) 策略模式

摘自<Design Paterns_Elements of Reusable Object-Oriented Software> 上一系列偏重于入门,从本篇开启进阶系列,着重于设计模式的适用情景. 回顾入门系列 设计模式入门(一)  策略模式 1  Intent Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary

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

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

设计模式实现C++ --策略模式Strategy(对象行为型)

1.问题 出行旅游:我们可以有几个策略可以考虑:可以骑自行车,汽车,做火车,飞机.每个策略都可以得到相同的结果,但是它们使用了不同的资源.选择策略的依据 是费用,时间,使用工具还有每种方式的方便程度. 2.解决方案 策略模式:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 策略模式把对象本身和运算规则区分开来,其功能非常强大,因为这个设计模式本身的核心思想就是面向对象编程的多形性的思想. strategy模式类图: 3.应用场景 1. 

从“假如有以下几种价格10,20,50,请你代码实现将他们排序输出”看着设计模式中的策略模式

今天重温了一下策略模式,将自己的一些感悟与大家分享...本人只是技术渣渣,所理解的东西的难免会有很大的局限性甚至是错误,还请各位带着批判的眼光去看待....不喜请勿吐槽 定义:策略模式属于设计模式中的对象行为型模式,它将用到的算法单独抽象成一个单独的类.通常,我们在多个类完成同一件事情,仅仅完成的方式不同时,我们可以考虑使用这种设计模式. 举例:相信,很多人在看到"假如有以下几种价格10,20,50,请你代码实现将他们排序输出"这种题目的时候,很快就写出了以下代码,写之前还不忘了问一下

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

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

设计模式(一):策略模式

一.设计背景 现实生活中,我们要做一件事情或者完成某项工作,往往有很多种途径.比如我们出游,可以选择坐汽车,坐火车,土豪点的选择是坐飞机.还有我们现在线下的支付方式也有了很多种选择,以前在外面忘了带钱的话可能一瓶水都难以买到,现在只要我们手机在身上,可以用微信或者支付宝. 在软件设计层面,我们把各种支付方式叫做策略.如果不考虑设计模式的话,我们可能会在一个类中用if..else方式来选择支付方式,即 if(type == 1){ //微信支付 }else if(type == 2){ // 支付

[设计模式] javascript 之 策略模式

定义: 封装一系列的算法,使得他们之间可以相互替换,本模式使用算法独立于使用它的客户的变化. 说明:策略模式,是一种组织算法的模式,核心不在于算法,而在于组织一系列的算法,并且如何去使用它:策略模式作用在于,行为实现的不可预见,面对这样的一种变化,我们得思考如何使用程序好维跟扩展,并使得客户很好的使用算法的方式: 策略模式 使用要注意它 "变化" 的一面,策略模式就是来解决这个 变化 问题的. 比如商场买卖的价格或促销问题,如果不使用模式,就可能只是 把“所有”的情况用 if else

head first 设计模式(-) 策略模式(鸭子)

目的:减少依赖 设计模式对应不同的需求,设计原则则代表永恒的灵魂,在实践中未必时刻遵守,但要时刻牢记. 1.依赖倒转原则(Dependence Inversion Principle) 2.接口隔离原则(Interface Segregation Principle) 3.里氏代换原则(Liskov Substitution Principle) 4.开闭原则(Open Close Principle) 5.迪米特法则(Demeter Principle) 6.合成复用原则(Composite