1.什么是-策略设计模式

在软件开发中常常遇到这种情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。如查找、排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法;当然也可以将这些查找算法封装在一个统一的方法中,通过if…else…或者case等条件判断语句来进行选择。
这两种实现方法我们都可以称之为硬编码,如果需要增加一种新的查找算法,需要修改封装算法类的源代码;更换查找算法,也需要修改客户端调用代码。在这个算法类中封装了大量查找算法,该类代码将较复杂,维护较为困难。如果我们将这些策略包含在客户端,这种做法更不可取,将导致客户端程序庞大而且难以维护,如果存在大量可供选择的算法时问题将变得更加严重。

2.策略设计模式的优缺点

1.1优点

1.1.1.可以动态的改变对象的行为
1.1.2.分离业务逻辑实现和需求

1.2缺点

1.2.1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类
1.3.2.策略模式将造成产生很多策略类

2.设计模式示例

2.1.示例背景

这里的示例是以小明和女朋友出去旅游选择交通工具做背景,之前设计模式职责链的时候小明已经请假相亲,结婚啥的都已经做完了,结完婚是不是该出去度蜜月了。一天小明决定去马尔代夫度蜜月,然后选择交通方式的时候犯愁了,小明是一位选择性强迫症的人,他在考虑是坐汽车还是火车还是飞机呢。他决定吧这三个想法告诉他的老婆小红,让小红来决定(Context类来充当这个角色)。三个交通工具类分别是:Aircraft-飞机,Automobile-汽车,Train-火车,每一种交通工具的最终目的都是为了出行,所以定义一个抽象类Travel 并定义抽象方法TravelInterface让三个交通工具实现该方法

2.2.代码区域

2.2.1.创建抽象类Travel 定义抽象方法

/*** 出行抽象类*/
public abstract class Travel {/*** 出行抽象的公共接口方法*/public abstract   void TravelInterface();
}

2.2.2.创建火车类并实现抽象Travel 类

/*** 火车类*/
public class Train extends Travel  {@Overridepublic void TravelInterface() {System.out.println("我选择乘坐火车去旅游");}
}

2.2.3.创建汽车类并实现抽象Travel 类

/*** 汽车类*/
public class Automobile extends Travel  {@Overridepublic void TravelInterface() {System.out.println("我选择乘坐汽车去旅游");}
}

2.2.4.创建飞机类并实现抽象Travel 类

/*** 飞机类*/
public class Aircraft extends Travel {@Overridepublic void TravelInterface() {System.out.println("我选择乘坐飞机去旅游");}
}

2.2.4.创建实现抽象出行的实现类-小明的媳妇

/*** 控制中心*/
public class Context {public void setStrategy(Travel strategy) {this.strategy = strategy;}private Travel strategy;public Context(Travel strategy) {this.strategy = strategy;}public void TravelInterface(){this.strategy.TravelInterface();}
}

2.2.5.创建小明测试类

/*** 出行选择对应的出行方式*/
public class TourismTest {public static void main(String args[]) {Context context=null;context=new Context(new Aircraft());/*通过传递某个出行对象来决定真正出行的交通工具*/context.TravelInterface();context=new Context(new Train());context.TravelInterface();context=new Context(new Automobile());context.TravelInterface();}
}

执行思路总结:从实例中可以看出来优缺点的确很明显,本身出行的交通工具都是可以划分为交通工具类的,只是动作方法实现不同,这也就是缺点策略模式将造成产生很多策略类。有没有发现策略模式和职责链模式有几分相似之处。这里小明发起请求最终再交给小红来实现,小红就是Context 这个类。

转载于:https://www.cnblogs.com/david97/p/8081338.html

Java设计模式之策略设计模式相关推荐

  1. Java中的策略设计模式

    策略设计模式是一种行为模式,其中我们有多种算法/策略来完成一项任务,所使用的算法/策略留给客户选择. 各种算法选项封装在单独的类中. 在本教程中,我们将学习在Java中实现策略设计模式. UML表示形 ...

  2. Java状态和策略设计模式之间的差异

    为了在Core Java应用程序中正确使用状态和策略设计模式,对于Java开发人员清楚地了解它们之间的区别很重要. 尽管状态和策略设计模式的结构相似,并且都基于开放式封闭设计原则,从SOLID设计原则 ...

  3. Java中的策略设计模式-示例教程

    策略模式是行为设计模式之一 . 当我们对一个特定任务有多种算法,并且客户端决定在运行时使用的实际实现时,将使用策略模式. 策略模式也称为策略模式 . 我们定义了多种算法,并让客户端应用程序将算法用作参 ...

  4. 工厂设计模式和策略设计模式_设计模式:策略

    工厂设计模式和策略设计模式 这次我想谈谈策略设计模式 . 通过这种方式,我开始撰写有关行为设计模式的文章. 这种模式表示对象之间的某些交互模式,以使代码更灵活且组织得更好.此方法的最本质点是对象之间的 ...

  5. 设计模式:策略设计模式

    一.什么是策略设计模式 1.1 策略设计模式定义 策略设计模式(Strategy Pattern)是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以让算法 ...

  6. 详解:设计模式之-策略设计模式

    分享一波:程序员赚外快-必看的巅峰干货 什么是策略模式 定义一系列的算法,并将每一个算法单独进行封装,而且使它们可以相互替换,从而达到传递不同参数而执行不同算法的结果. 策略模式让算法独立于使用它的客 ...

  7. java策略设计模式_Java中的策略设计模式

    java策略设计模式 策略设计模式是一种行为模式,其中我们有多种算法/策略来完成一项任务,所使用的算法/策略留给客户选择. 各种算法选项封装在单独的类中. 在本教程中,我们将学习在Java中实现策略设 ...

  8. java状态模式和策略模式_Java状态和策略设计模式之间的差异

    java状态模式和策略模式 为了在Core Java应用程序中正确使用状态和策略设计模式,对于Java开发人员清楚地了解它们之间的区别很重要. 尽管状态和策略设计模式的结构相似,并且都基于开放式封闭设 ...

  9. java 设计模式 示例_Java中的策略设计模式-示例教程

    java 设计模式 示例 策略模式是行为设计模式之一 . 当我们对一个特定的任务有多种算法并且客户决定在运行时使用的实际实现时,将使用策略模式. 策略模式也称为策略模式 . 我们定义了多种算法,并让客 ...

最新文章

  1. CSS 负边距自适应布局
  2. java对象转json字符串日期格式_fastJSON字符串类型数据中的日期转换为Java bean的日期对象...
  3. 14.索引数组初始化
  4. 项目: 图片放大缩小。
  5. Referenced file contains errors (http://www.springframework.org/schema/beans/spring-beans-4.3.xsd).
  6. oracle说明性弹性域,ORACLE EBS 基础和提高 - 说明弹性域(ZHENGANG.ZHU).pdf
  7. 示例解读 Python 2 和 Python 3 之间的主要差异
  8. ns2相关学习——TCL脚本编写(3)
  9. java笔试必考知识_面试必备:常考Java基础知识总结(持续更新)
  10. hypopg1.3.0 使用-常用命令
  11. python音乐制作_Python实现音乐的剪辑
  12. 卡巴斯基2009注册机[纯绿色版本]
  13. Selenium自动化程序被检测为爬虫,怎么屏蔽和绕过
  14. 上海市高级人民法院网
  15. crontab根据定时检测程序状态,重启程序
  16. 跟小博老师一起学习数据库 ——MySql安装
  17. Windows RGBDS 及 BGB 的安装 及 HelloWorld
  18. 【5G核心网】free5GC UPF源码分析
  19. [转] FileZilla Server超详细配置
  20. API网易考拉,根据ID取商品详情

热门文章

  1. java中方法的参数传递机制
  2. W4_python_decorator_generator_Iteratable_Iterator_json_pickle
  3. 使用MapReduce将HDFS数据导入Mysql
  4. SpringMVC(十七-二十) ModelAttribute 注解
  5. allegro大十字光标设置方法
  6. C++ 学习笔记----类篇
  7. Matlab数理统计工具箱应用简介
  8. Mini 容器学习笔记6——组件的获取(应用)
  9. C++提取PDF页成BMP图片
  10. 服务器的虚拟主机用途,服务器的虚拟主机用途