策略模式,我与你的三次相遇。

从商场打折到机房重构计算固定用户和临时用户的消费情况,再到现在的Duck,三次接触类策略模式,可见这是一个比较重要的模式.

在使用策略模式之前,首先要知道什么是策略模式?策略模式是干吗用的?策略模式有它的好处也必定存在一定的缺陷.

策略模式:

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

策略模式其实就是用来封装算法的。当不同的行为堆砌在一个类中,就很难避免使用条件语句来选择合适的行为。我们就可以用策略模式,将这些行为封装在一个个独立的Strategy类中,就可以消除这些类中的条件语句了。

商场打折:

商场收银时,不管理打折还是返利,都是一些算法,我们把这些算法是可变的,我们把这些变化的封装起来,也实现了面向对象的思维方式。

机房重构:

做机房收费系统时,我们对临时用户和固定用户的收费方式是不一样的,但是他们的本质是一样的,都是计算学生的消费金额,这是我们就把它写成策略模式,把两种不同的算法封装起来。

Duck:

这次又用java语言重新认识了一下策略模式,鸭子继承Duck,飞行行为实现FlyBehavior接口,呱呱叫的行为实现QuackBehavior接口。其实鸭子的行为就可以看成算法,万变不离其宗,意思是一样的,封装了鸭子的行为相当于我们封装了算法。

优点:

策略模式不仅提供了管理各种算法的办法,简化了单元测试,我们可以通过每个类自己的接口单独测试;避免了我们使用多重条件转移语句;继承有助于吸取出这些算法中的公共功能。

每一种模式都要他存在的优势,不然也不会存在。当然,缺点也是必不可少,人无完人,模式也没有十分完美的模式。

缺点:

策略模式只适用于客户端知道所有的算法或行为的情况。而且策略模式会造成很多策略类,每一个具体策略类又会产生一个新类。

策略模式使用了三次了,第一次用C#,第二次用VB.net,第三次用java。每一次用,感觉都不一样,你问我有什么不一样的。当然是越来越熟悉的感觉了,嘿嘿。

----------------------------------------------------------------------------------------------------------------------------(^_^)
    学习是一个循序渐进,反反复复的过程       (^_^)

时间: 2024-12-18 12:24:00

策略模式,我与你的三次相遇。的相关文章

【设计模式】 模式PK:策略模式VS状态模式

1.概述 行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,我们先看看两者的通用类图,把两者放在一起比较一下. 策略模式(左)和状态模式(右)的通用类图. 两个类图非常相似,都是通过Context类封装一个具体的行为,都提供了一个封装的方法,是高扩展性的设计模式.但根据两者的定义,我们发现两者的区别还是很明显的:策略模式封装的是不同的算法,算法之间没有交互,以达到算法可以自由切换的目的:而状态模式封装的是不同的状态,以达到状态切换行为随之发生改变的目的.这两种模式虽然都有变换的行为,但

【原】设计模式-策略模式(Strategy Model)

1.概述 在开发过程中常常会遇到类似问题,实现一个功能的时候往往有多种算法/方法(策略),我们可以根据环境的不同来使用不同的算法或策略来实现这一功能. 如在人物比较排序的实现中,我们有时需要把年龄做为比较的标准,或者有时又想将身高作为比较的标准,不同的比较标准也就衍生出了统一个比较目的的不同算法实现,在搜索问题中也是类似,有可能用到二分查找.顺序查找之类.通常较简单直接的思维便是将所有的算法(策略)写成一个类的方法,再通过客户端去调用:也可一将所有的算法全部封装在一个方法中用一堆的if...el

java设计模式之策略模式总结

策略模式的定义:(定义截自http://www.cnblogs.com/whgk/p/6087064.html) 1.策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户 换句话讲,也就是将那些使用的方法分别封装成独立的类,然后将这一类使用接口统一管理起来,让需要使用这些方法的用户能够随时调用它们.上面例子中的战斗行为就相当于定义中的算法一词.只是换了个说法而已. 缺点: 1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类.这就意味着客户端必

(三)策略模式-C++实现

策略模式:定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换,本模式使得算法可独立于使用它的客户而变化. 三种角色: 1.策略:一个抽象类,这个接口定义了若干个算法标识,即多个虚函数,这些个算法的实现在不同场景可能会不一样. 2.具体策略:它实现了策略,实现抽象类中定义个算法标识,即给出具体算法实现. 3.上下文:它依赖于策略抽象类,即上下文 包含 策略声明的指针,上下文中提供一个方法,该方法委托策略调用具体策略所实现的算法. C++实现包含三个文件,一个头文件策略类的声明strate

Javascript设计模式学习三(策略模式)

定义:定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换.目的:将算法的使用和算法的实现分离开来.比如: if(input == 'A'){ return 1; } if(input == 'B'){ return 2; } if(input == 'C'){ return 3; } //或者 switch(input){ case 'A': console.log(1); break; case 'B': console.log(2); break; case 'C': conso

(三)设计模式之PHP项目应用(策略模式:商场收银系统)

1 策略模式简介 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 2 模式组成 1)抽象策略角色(Strategy): 策略类,通常由一个接口或者抽象类实现. 2)具体策略角色(ConcreteStrategy): 包装了相关的算法和行为. 3)环境角色(Context): 持有一个策略类的引用,最终给客户端调用. 3 模式核心思想 策略模式是一种定义一些列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是

三分钟理解“策略模式”——设计模式轻松掌握

实际问题: 由于超市隔三差五就要办促销活动,但每次促销活动的方式不一样,所以需要开发一个软件,营业员只要输入原价再选择活动类型后,就能计算出折扣以后的价钱. 普通人的做法: mian(){ String input = readLine(); double price = readLine(); switch (input) case "九五折": price = price * 0.95; break; case "满100返50": if(price>=1

设计模式之策略模式

一.概述我们来实现一个企业的工资系统,该企业中不同级别的员工工资算法都不相同,针对该问题,最容易想到的莫过于在代码中堆积一大堆if…else…语句或者是switch…case…语句.如果该企业中不同级别的员工过多,或是对级别的调整比较频繁,那该系统就会显得复杂而脆弱.如何能将对象和算法解耦,从而使得在系统运行时能透明的改变对象的算法呢?这就到了策略模式大显身手的时候了.二.策略模式策略模式定义了一系列算法,把它们一个个封装起来,并且使它们可相互替换.该模式可使得算法能独立于使用它的客户而变化.策

Strategy Design Pattern(策略模式)

策略模式意义在于,当我们有多种不同的算法时,程序能够动态的选择算法进行计算. 策略模式的另外一个英文名字是Policy Strategy. 策略模式最典型的里一个例子就是JAVA中复杂对象的排序(java.util.Arrays.sort,java.util.Collections.sort),用户可以自己定义各种排序算法(规则),然后在需要排序时将算法传给排序函数.从而实现排序方式的变化,获得不同的排序结果.参见:http://my.oschina.net/nox/blog/487478 下面