原文:http://blog.csdn.net/jason0539/article/details/45007553

背景
在软件开发中常常遇到这种情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。如查找、排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法;当然也可以将这些查找算法封装在一个统一的方法中,通过if…else…或者case等条件判断语句来进行选择。
这两种实现方法我们都可以称之为硬编码,如果需要增加一种新的查找算法,需要修改封装算法类的源代码;更换查找算法,也需要修改客户端调用代码。在这个算法类中封装了大量查找算法,该类代码将较复杂,维护较为困难。如果我们将这些策略包含在客户端,这种做法更不可取,将导致客户端程序庞大而且难以维护,如果存在大量可供选择的算法时问题将变得更加严重。
问题
如何让算法和对象分开来,使得算法可以独立于使用它的客户而变化?
方案
把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口,然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。
比如定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换,使得算法可独立于使用它的客户而变化。这就是策略模式。
适用情况
许多相关的类仅仅是行为有异。 “策略”提供了一种用多个行为中的一个行为来配置一个类的方法。即一个系统需要动态地在几种算法中选择一种。
当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用。
一个类定义了多种行为 , 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。
优点
1、可以动态的改变对象的行为
缺点
1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类
2、策略模式将造成产生很多策略类
组成
环境类(Context):用一个ConcreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。
抽象策略类(Strategy):定义所有支持的算法的公共接口。 Context使用这个接口来调用某ConcreteStrategy定义的算法。
具体策略类(ConcreteStrategy):以Strategy接口实现某具体算法。
应用
场景如下,刘备要到江东娶老婆了,走之前诸葛亮给赵云三个锦囊妙计,说是按天机拆开能解决棘手问题。场景中出现三个要素:三个妙计(具体策略类)、一个锦囊(环境类)、赵云(调用者)。
抽象策略类(Strategy)
[java] view plaincopyprint?
  1. public interface Strategy {
  2. public void operate();
  3. }
三个实现类(ConcreteStrategy):
妙计一:初到吴国
[java] view plaincopyprint?
  1. public class BackDoor implements IStrategy {
  2. @Override
  3. public void operate() {
  4. System.out.println("找乔国老帮忙,让吴国太给孙权施加压力,使孙权不能杀刘备");
  5. }
  6. }
妙计二:求吴国太开绿灯放行

[java] view plaincopyprint?
  1. public class GivenGreenLight implements IStrategy {
  2. @Override
  3. public void operate() {
  4. System.out.println("求吴国太开个绿灯,放行");
  5. }
  6. }
妙计三:孙夫人断后,挡住追兵
[java] view plaincopyprint?
  1. public class BlackEnemy implements IStrategy {
  2. @Override
  3. public void operate() {
  4. System.out.println("孙夫人断后,挡住追兵");
  5. }
  6. }

环境类(Context)

[java] view plaincopyprint?
  1. public class Context {
  2. private Strategy strategy;
  3. //构造函数,要你使用哪个妙计
  4. public Context(Strategy strategy){
  5. this.strategy = strategy;
  6. }
  7. public void setStrategy(Strategy strategy){
  8. this.strategy = strategy;
  9. }
  10. public void operate(){
  11. this.strategy.operate();
  12. }
  13. }

下面就是使用的情况了

[java] view plaincopyprint?
  1. public class Zhaoyun {
  2. public static void main(String[] args) {
  3. Context context;
  4. System.out.println("----------刚到吴国使用第一个锦囊---------------");
  5. context = new Context(new BackDoor());
  6. context.operate();
  7. System.out.println("\n");
  8. System.out.println("----------刘备乐不思蜀使用第二个锦囊---------------");
  9. context.setStrategy(new GivenGreenLight());
  10. context.operate();
  11. System.out.println("\n");
  12. System.out.println("----------孙权的追兵来了,使用第三个锦囊---------------");
  13. context.setStrategy(new BlackEnemy());
  14. context.operate();
  15. System.out.println("\n");
  16. }
  17. }
三招下来,搞得的周郎是“赔了夫人又折兵”。
以上就是策略模式,多种不同解决方案动态切换,起到改变对象行为的效果。

Java设计模式之策略模式---写的比较有趣,推荐大家看看相关推荐

  1. Java设计模式之策略模式与状态模式

    一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...

  2. Java设计模式之策略模式+工厂模式+模板模式

    Java设计模式之策略模式+工厂模式+模板模式 1.策略模式+工厂模式+模板模式 个人的理解:实际开发工程中,一些业务很复杂的逻辑使用很多的 if 或者 if···else 语句,不利于维护和扩展,为 ...

  3. Java设计模式之策略模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  4. 【设计模式】java设计模式之 -- 策略模式

    对于代码中总是会有需要变化的部分和需要固定不变的部分.对于需要变化的部分,一般可以采用继承的方式,让子类对父类的方法进行重写,以改变已有的行为:如果变化的部分并不是所有子类都必须要有的,那就可以采用接 ...

  5. 【Java设计模式】策略模式

    (转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景知识 策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法.比如每 ...

  6. Java 设计模式之策略模式

    一.了解策略模式 1.1 什么是策略模式 策略模式 (Strategy Pattern) 是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换.此模式让算法的变化独立于使用算法的客 ...

  7. java解决策略膨胀_折腾Java设计模式之策略模式

    简介 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式.简单理解就是一组算法,可以互换,再简单点策略就是封装算法. 意图 定义一 ...

  8. Java设计模式之——策略模式

    策略模式的简单介绍 在软件开发中常常遇到这样的情况:实现某一个功能可以有多种算法或者策略,我们根据事件情况选择不同的算法或者策略来完成该功能.例如,排序算法,可以使用插入排序.归并排序.冒泡排序等. ...

  9. Java设计模式之——策略模式(Strategy)

    一.例子 令狐冲被岳不群罚在思过崖上面壁思过.偶然的机会发现崖内有一个后洞,石壁上刻有魔教十长老尽破五岳剑派的图形招式.所有五岳剑派引以为豪的精微奥妙招式尽数被破得干干净净,包括一些已经失传的招式. ...

最新文章

  1. 【方法整理】Oracle 获取trace跟踪文件名的几种常用方式
  2. SQL Server2005的XML数据类型之基础篇 (2)
  3. 精华阅读第 9 期 |滴滴出行 iOS 客户端架构演进之路
  4. 【matlab】将matlab中数据输出保存为txt或dat格式
  5. Java8-Guava实战示例
  6. C++学习之路 | PTA乙级—— 1057 数零壹 (20 分)(精简)
  7. cad2006安装未找到html文件,启动 AutoCAD 时显示“加载自定义文件失败。未找到文件”...
  8. 服务器Windows 2008 R2 安装SQL 2008 R2
  9. C#中Math.Round()实现中国式四舍五入
  10. matlab rem与mod 的区别
  11. 辉迅手机号码归属地查询软件 手机号码归属地 手机查询
  12. 201671030108 +词频统计软件项目报告
  13. 【STM32 .Net MF开发板学习-12】跳动的音符(PWM合成)
  14. oracle 无法在指定的节点上,oracle 11g rac 某节点CRS起不来的解决方法
  15. 计算机机房门尺寸,门的尺寸怎么量呢
  16. (Maven+SSM)实战之spring mybatis整合
  17. 想知道香港汇丰银行如何开户吗?
  18. 数据库新增修改和删除
  19. java方向的光脚丫子的电影,斯嘉丽·约翰逊:“光着脚丫子”示人,这足踝,这足弓,爱了好吗...
  20. 小龙虾是如何成为直播间爆款的

热门文章

  1. zoj 3761 Easy billiards 并查集+dfs
  2. 假设你有一个数组,其中第i 个元素是第i天给定股票的价格。设计算法以找到最大利润。你可以根据需要完成尽可能多的交易(即,多次买入并卖出一股股票)。注意:您不能同时进行多笔交易(即,您必须在再次购买之前
  3. 17行代码AC——习题5-3 卡片游戏(Throwing cards away I, UVa 10935,约瑟夫环)_解题报告
  4. 关于SET和UNORDER_SET
  5. 苹果mac电脑修改并快速linux网络配置
  6. oracle12c完全卸载工具_oracle完全卸载方法
  7. mac VMware Fusion 虚拟机键盘可以使用,鼠标无法使用排查思路及解决方法
  8. Linux下安装、查看、删除软件包
  9. HTML 取消超链接下划线
  10. 易语言 服务器抓包,易语言抓包获得地址实现TP路由器登陆的代码