模板方法是通过继承实现的,在父类中定义出算法的骨架,将不同点在子类中实现。而策略模式是通过接口实现的,策略中定义了完整的算法。它们有点像啊……

策略模式的定义

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

  我的理解是,策略模式是透明的,对于策略的实现有时是不用关心的,我只要达到我的目的就可以了,而具体的实现可能有多种手段,而根据不同的选择可以有不同的手段。而对于模板方法来说,它的流程是基本固定的,而某个环境中的实现方式是可变的,但是整体是不变的。这是我理解的它们之间的不同,至于编码的话,模板方法使用的是继承的方式,而策略模式使用的是接口。

代码示例

  仍然以吃面为主,比如程序员要吃面,程序员中午可能去便利店让店员泡面来吃,而程序员黑夜回家可能让老妈给煮面来吃。对于我们来说,我们是要吃面的,至于吃什么面,自己说一下就可以了,至于吃的这个面是怎么做的,就不关心了,做面的策略也根据不同的面有所不同。

 class StrategyPattern {
public static void main(String[] args) {
Ren cxy = new ChengXuYuan(); System.out.println("程序员中午吃饭"); cxy.setIZm(new PaoMian());
cxy.eat(); System.out.println("程序员晚上吃饭"); cxy.setIZm(new ZhuMian());
cxy.eat();
}
} interface IZuoMian {
public void zuoMian();
} class PaoMian implements IZuoMian {
public void zuoMian() {
System.out.println("揭开碗面的包装纸");
System.out.println("冲开水");
System.out.println("泡面中...");
System.out.println("泡好了");
}
} class ZhuMian implements IZuoMian {
public void zuoMian() {
System.out.println("烧开水...");
System.out.println("下面...");
System.out.println("捞面...");
}
} abstract class Ren {
public IZuoMian zm; public void setIZm(IZuoMian zm) {
this.zm = zm;
} public void eat() {
zm.zuoMian();
System.out.println("吃面");
}
} class ChengXuYuan extends Ren { }

  在Ren类中,都是要有eat()方法的,是人就要吃!但是吃什么要自己说。根据自己要吃的不同,具体做的也就不同了,这里是做面吃,当然这个做面也可以是做饭。

  在代码中实现了泡面和煮面两种方式,做面是一个接口即IZuoMian(),通过把做面的具体实现的类传递给Ren类中的接口属性,就可以通过该属性来完成具体的做面过程。

  执行输出如下:

总结:

  总结来自于《大话设计模式》一书中第二章“商场促销——策略模式”。

1、面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。(这里是我的理解:也就是说策略只是一个算法,可以说是有相应的功能,而没有相应的属性,因此封装为一个接口更为合适)

2、策略模式(Strategy):它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户;

3、策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合;

4、策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法中的公共功能;

5、策略模式的优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试;

6、当不同的行为堆切在一个类中时,就很难避免使用条件语句来选择合适的行为。将这些行为封装在一个个独立的Strategy类中,可以在使用这些行为的类中消除条件语句;

7、策略模式就是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性;

8、在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。


我的微信公众号:“码农UP2U”

设计模式之策略模式(Strategy Pattern)的更多相关文章

  1. 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

  2. 反馈法学习设计模式(一)——策略模式Strategy Pattern

    简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...

  3. 8.6 GOF设计模式四: 策略模式… Strategy Pattern

    策略模式… Strategy Pattern  在POS系统中,有时需要实行价格优惠, 该如何处理?  对普通客户或新客户报全价  对老客户统一折扣5%  对大客户统一折扣10%  注:课件 ...

  4. 二十四种设计模式:策略模式(Strategy Pattern)

    策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有 ...

  5. 设计模式原来如此-策略模式(Strategy Pattern)

    策略模式中体现了两个非常基本的面向对象设计的原则:1.封装变化的概念.2.编程中使用接口,而不是对接口的实现. 策略模式的定义:定义一组算法,将每个算法都封装起来,并使它们之间可以互换.策略模式使这些 ...

  6. 【UE4 设计模式】策略模式 Strategy Pattern

    概述 描述 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法的变化不会影响到使用算法的客户. 套路 Context(环境类) 负责使用算法策略,其中维持了一 ...

  7. 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

    在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...

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

    策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...

  9. HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern)

    策略模式(Strategy Pattern): 定义了了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端. 第一个设计原则:找出应用中可能需要变化之处,把他们独立 ...

  10. JAVA设计模式之策略模式 - Strategy

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...

随机推荐

  1. 2013 HTML5中国峰会演讲:Android上的HTML5:过去,现在和将来

    转载请注明原文地址:http://blog.csdn.net/milado_nju ## 会议链接(应用和工具专场) http://2013.html5dw.com/main, 2013年8月10日 ...

  2. myeclipse 彻底让烦人的各种验证消失 让你的开发速度飞快

    大家都知道,myeclipse的验证很吭爹,不但保存的时候要难,BUILD的时候也要验.常常为了等它而浪费了大浪的时间!!真不知道设计人员当初是怎么加进这种功能的.真心不需要. 以前都是到window ...

  3. ORM对象关系映射之GreenDAO自定义属性转换器PropertyConverter

    在使用GreenDAO定义实体的属性时候,通常来说定义的实体属性名就是对应的表的字段名.实体中属性的类型(如Long.String等)就是表的字段名类型,但是我们难免会有不一样的需求,比如实体中我定义 ...

  4. BASE64Decoder小解

    BASE64Decoder小解 Base64 是网络上最常见的用于传输8Bit 字节代码的编码方式之一,大家可以查看RFC2045 -RFC2049 ,上面有MIME 的详细规范. Base64 要求 ...

  5. MTK平台 Android4.0.3 定制关机动画

    实现效果是这样的,长按电源键弹出关机对话框,选择关机项将呈现关机动画和音乐直到正常关机完毕,下面说说具体思路及实现代码 找到长按电源键控制代码 /frameworks/base/policy/src/ ...

  6. 【42】android Context深度剖析

    android程序和java程序的区别 Android程序不像Java程序一样,随便创建一个类,写个main()方法就能跑了,而是要有一个完整的Android工程环境,在这个环境下,我们有像Activ ...

  7. Linux Framebuffer驱动剖析之一—软件需求

    嵌入式企鹅圈将以本文作为2015年的终结篇,以回应第一篇<Linux字符设备驱动剖析>.嵌入式企鹅圈一直专注于嵌入式Linux和物联网IOT两方面的原创技术分享,稍后会发布嵌入式企鹅圈的2 ...

  8. 如何在ubuntu开启ssh服务-使 SecureCRT远程登录

    不少人在第一次使用ubuntu系统的时候,用了很多种方法均没有办法开启SSH服务,ubuntu和其它的linux系统有所区别,因为在ubuntu下,service  sshd  restart  之类 ...

  9. SSH框架项目开发命名规范

    SSH 框架项目开发命名规范   一.各层包及类命名规范   总体原则:包名所有字母小写,类名采用 "驼峰标识",具体如下:   1. Action 类      包命名规范:co ...

  10. Java 8 Stream

    1.关于Java8部分新特性介绍 Java8的新特性很多,在此就不一一介绍了,这里只说一下我自己在工作用用得比较多的几点: 1.1.Lambda表达式 Lambda允许把函数作为一个方法的参数(函数作 ...