设计模式之第8章-策略模式(Java实现)

  “年前大酬宾了啊,现在理发冲500送300,冲1000送500了。鱼哥赶紧充钱啊,理发这事基本一个月一回,挺实惠的啊。不过话说那个理发店的老板好傻啊,冲1000才送500,不如冲两次500,这样可以送600呢。”“这只能说明你不是很笨,但是也算不上聪明。”“啊?难道我想错了?”“这是一种策略,策略,懂?他如果是冲1000送700的话你是不是很大的可能性冲500?而不是1000,但是如果这样的话,在“聪明人”,对,没错,就是你这样的人来说,冲两次500表示对于老板的智商上的鄙视,那么,你就会冲1000了吧,这么说来,你懂了么?”“好吧,亏我还是策略模式,这点小把式就把我给蒙骗了,丢人丢大发了。”(编者按:小子,你还是图样图森破啊。)

策略模式之自我介绍

  洒家呐,是一种比较简单的模式,定义如下:

  Define a family of algorithms, encapsulate each one, and make them interchangeable。翻译过来就是说:定义一组算法,或将每个算法都封装起来,并且使他们之间可以互换。下面给出具体类图:

  由于图中的介绍已经很详细了,所以就不再赘述,我使用的就是面向对象的继承和多态机制,理解起来那可是相当的容易~

策略模式之自我分析

  若说到好处和劣势么,恩,先说劣势吧:

  • 客户如果想选择一个合适的策略,那么就务必了解所有的策略以及各个策略之间有什么不同,这个时候就不得不暴漏策略具体的实现。不过嘛,魔高一尺道高一丈(好像哪里有点不对、、、不管了,继续),这个缺点可以配合着先前讲的工厂方法模式来弥补了。
  • Strategy与Context之间的通信开销,由于策略算法不一定全部用得到,所以会带来一定的浪费。
  • 增加了对象的数目。

  优势:

  • 算法可以自由切换。
  • 避免使用多重判断语句,消除一些条件语句。
  • 扩展性良好。
  • 可以根据不同的时间/空间的要求选择不同的策略。

策略模式之实现

  话说是骡子是马拉出来遛遛,既然如此,那洒家就把代码亮出来,请各位戴好墨镜。以下代码就根据理发店充值活动来实现的。首先是抽象的策略接口:

 public interface Strategy{
//每个充值的方法都是一个算法
public void reCharge();
}

  然后是冲500送300的策略:

 public class St1 implements Strategy{
public viod reCharge(){
System.out.println("冲500送300");
}
}

  接着是冲1000送500的策略的具体实现:

 public class St2 implements Strategy{
public viod reCharge(){
System.out.println("冲1000送500");
}
}

  接下来这个还需要一个封装类用于放这些个策略,方便使用,也就是类图中的Context封装类,代码如下:

 public class Context{
//构造函数,你要入手哪一个优惠政策
private Strategy strategy;
public Context (Strategy strategy)
{
this.strategy = strategy;
} //入手优惠政策
public void reCharge(){
this.strategy.reCharge();
}
}

  通过构造函数把优惠政策传进去,然后用reCharge方法来执行相关的策略方法。什么,还不懂?好吧好吧,服了你啦,看洒家写一个测试类:  

 public class Y{

     public static void main(String[] args) {
Context context;
//入手第一个优惠
context = new Context(new St1());
context.reCharge(); //入手第二个优惠
context = new Context(new St2());
context.reCharge();
}
}

  好了,具体实现到此结束。下面介绍一下应用的场景。

策略模式之运用场景

  当存在以下情况时,可以考虑使用策略模式:

  • 许多相关的类仅仅是行为有异。
  • 需要使用一个算法的不同变体。
  • 一个类定义了多种行为。
  • 需要屏蔽算法规则。

  

   PS:本博客欢迎转发,但请注明博客地址及作者~

   博客地址:http://www.cnblogs.com/voidy/

   博客新址:http://voidy.net

   <。)#)))≦

设计模式之第8章-策略模式(Java实现)的更多相关文章

  1. 设计模式之第16章-代理模式(Java实现)

    设计模式之第16章-代理模式(Java实现) “现在朋友圈真是太让人蛋疼了啊.”“怎么说?”“一堆代理,各种卖东西的,看着好烦人.”“哎,删了呗.”“都是朋友,哪里好意思删啊.”“这倒也是...哎,迫 ...

  2. 设计模式之第7章-外观模式(Java实现)

    设计模式之第7章-外观模式(Java实现) “鱼哥,知道怎么把大象装进冰箱里面么?”(作者按:这么简单的问题还想考我,早了几百年吧.)“把大象装进冰箱里,一共需要三步:第一步,把冰箱门打开:第二步,把 ...

  3. 设计模式之第22章-组合模式(Java实现)

    设计模式之第22章-组合模式(Java实现) “鱼哥,有没有什么模式是用来处理树形的“部分与整体”的层次结构的啊.”“当然”“没有?”“有啊.别急,一会人就到了.” 组合模式之自我介绍 “请问你是?怎 ...

  4. 设计模式之第21章-状态模式(Java实现)

    设计模式之第21章-状态模式(Java实现) “what are you 干啥了?怎么这么萎靡不振?”“昨晚又是补新番,又是补小笼包,睡得有点晚啊.话说杨过的那个雕兄真是太好了,每天给找蛇胆,又陪练武 ...

  5. 设计模式之第20章-访问者模式(Java实现)

    设计模式之第20章-访问者模式(Java实现) “嘿,你脸好红啊.”“精神焕发.”“怎么又黄了?”“怕冷,涂的,涂的,蜡.”“身上还有酒味,露馅了吧,原来是喝酒喝的啊.”“嘿嘿,让,让你发现了,今天来 ...

  6. 设计模式之第17章-备忘录模式(Java实现)

    设计模式之第17章-备忘录模式(Java实现) 好男人就是我,我就是曾小贤.最近陈赫和张子萱事件闹得那是一个沸沸扬扬.想想曾经每年都有爱情公寓陪伴的我现如今过年没有了爱情公寓总是感觉缺少点什么.不知道 ...

  7. 设计模式之第14章-命令模式(Java实现)

    设计模式之第14章-命令模式(Java实现) “小明,滚出去.”“小明,这个问题怎么做?”(可怜的小明无奈躺枪.小明:老师,我和你有什么仇什么怨,我和你有什么仇什么怨啊到底...老师:小明,滚出去.习 ...

  8. 设计模式之第11章-建造者模式(Java实现)

    设计模式之第11章-建造者模式(Java实现) “那个餐厅我也是醉了...”“怎么了?”“上菜顺序啊,竟然先上甜品,然后是冷饮,再然后才是菜什么的,无语死了.”“这个顺序也有人这么点的啊.不过很少就是 ...

  9. 设计模式之第10章-桥接模式(Java实现)

    设计模式之第10章-桥接模式(Java实现) “一入软件深似海,从此早睡是路人.黑夜给了我黑色的眼睛,我却用他去寻找八阿哥.”“怎么了,又来那么多的感慨啊.”“还能有什么啊,老板是说让换个APP做,这 ...

随机推荐

  1. Don't let anyone tell you different.

    Don't let anyone tell you different.不要让任何人否定你的与众不同.

  2. react的setState使用中遇到的问题

    setState()更新的数据和自己预期的不一致 对 React 新手来说,使用 setState 是一件很复杂的事情.即使是熟练的 React 开发,也很有可能因为 React 的一些机制而产生一些 ...

  3. FusionCharts可使用JavaScript渲染iPhone/iPod/iPad图表

    FusionCharts使用JavaScript: FusionCharts允许用户创建建立JavaScript图表(也就是web上的HTML5 /Canvas图表).这个特性允许用户在不支持Flas ...

  4. 无效的 JSON 基元 解决办法

    在AJAX中进行如下修改: 加入: dataType: "json", 移除: contentType: 'application/json', 然后检查参数名称,类型是否符合后台 ...

  5. POJ 1769 Minimizing maximizer (线段树优化dp)

    dp[i = 前i中sorter][j = 将min移动到j位置] = 最短的sorter序列. 对于sorteri只会更新它右边端点r的位置,因此可以把数组改成一维的,dp[r] = min(dp[ ...

  6. BZOJ 2502: 清理雪道

    BZOJ 2502: 清理雪道 标签(空格分隔): OI-BZOJ OI-最小流 OI-上下界网络流 Time Limit: 10 Sec Memory Limit: 128 MB Descripti ...

  7. SyntaxHighlighter使用方法

    原名:SyntaxHighlighter,是一款用于web页面的代码着色工具,可以用来着色多种语言,可以是HTML,CSS,Javascript,还可以是C,JAVA等编程语言.最早见于Yahoo的Y ...

  8. oracle 多行数据合并一行数据

    在工作中遇见的oracle知识,多行合并成一行,记录一下 1.取出需要的数据,代码: (SELECT to_char(m.f_meetdate, 'yyyy-MM-dd'), decode(nvl(m ...

  9. find cat sed awk 简单组合使用

    find:查找 // .表示当前目录:   /表示根目录:  | 管道符:  xargs表示将前面的搜索接口作为参数传递到后面的命令中:grep 过滤 // xxxx表示文件名 1.查找指定文件名的文 ...

  10. float浮动布局(慕课网CSS笔记 + css核心技术详解第四章)

    ---------------------------------------------------------------------- CSS中的position: CSS三种布局方式: 标准流 ...