JAVA语言之策略模式
小职 2018-06-21 来源 : 阅读 632 评论 0

摘要:本文主要向大家介绍了JAVA语言的策略模式,通过具体的内容向大家展现,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言的策略模式,通过具体的内容向大家展现,希望对大家学习JAVA语言有所帮助。

背景

在软件开发中常常遇到这种情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。如查找、排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法;当然也可以将这些查找算法封装在一个统一的方法中,通过if…else…或者case等条件判断语句来进行选择。

这两种实现方法我们都可以称之为硬编码,如果需要增加一种新的查找算法,需要修改封装算法类的源代码;更换查找算法,也需要修改客户端调用代码。在这个算法类中封装了大量查找算法,该类代码将较复杂,维护较为困难。如果我们将这些策略包含在客户端,这种做法更不可取,将导致客户端程序庞大而且难以维护,如果存在大量可供选择的算法时问题将变得更加严重。

问题

如何让算法和对象分开来,使得算法可以独立于使用它的客户而变化?

方案

把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口,然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。

比如定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换,使得算法可独立于使用它的客户而变化。这就是策略模式。

适用情况

许多相关的类仅仅是行为有异。 “策略”提供了一种用多个行为中的一个行为来配置一个类的方法。即一个系统需要动态地在几种算法中选择一种。

当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用。

一个类定义了多种行为 , 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

优点

1、可以动态的改变对象的行为

缺点

1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类

2、策略模式将造成产生很多策略类

组成

环境类(Context):用一个ConcreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。

抽象策略类(Strategy):定义所有支持的算法的公共接口。 Context使用这个接口来调用某ConcreteStrategy定义的算法。

具体策略类(ConcreteStrategy):以Strategy接口实现某具体算法。

应用

场景如下,刘备要到江东娶老婆了,走之前诸葛亮给赵云三个锦囊妙计,说是按天机拆开能解决棘手问题。场景中出现三个要素:三个妙计(具体策略类)、一个锦囊(环境类)、赵云(调用者)。

抽象策略类(Strategy)

[java] view plain copy
1. public interface Strategy {  
2.      public void operate();  
3. }

三个实现类(ConcreteStrategy):

妙计一:初到吴国

[java] view plain copy
1. public class BackDoor implements IStrategy {  
2.      @Override  
3.      public void operate() {  
4.           System.out.println("找乔国老帮忙,让吴国太给孙权施加压力,使孙权不能杀刘备");  
5.      }  
6. }

妙计二:求吴国太开绿灯放行

[java] view plain copy
1. public class GivenGreenLight implements IStrategy {  
2.      @Override  
3.      public void operate() {  
4.           System.out.println("求吴国太开个绿灯,放行");  
5.      }  
6. }

妙计三:孙夫人断后,挡住追兵

[java] view plain copy
1. public class BlackEnemy implements IStrategy {  
2.      @Override  
3.      public void operate() {  
4.           System.out.println("孙夫人断后,挡住追兵");  
5.      }  
6. }

环境类(Context)

[java] view plain copy
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 plain copy
1. public class Zhaoyun {  
2.   
3. public static void main(String[] args) {  
4.      Context context;  
5.   
6.      System.out.println("----------刚到吴国使用第一个锦囊---------------");  
7.      context = new Context(new BackDoor());  
8.      context.operate();  
9.      System.out.println("\n");  
10.   
11.      System.out.println("----------刘备乐不思蜀使用第二个锦囊---------------");  
12.      context.setStrategy(new GivenGreenLight());  
13.      context.operate();  
14.      System.out.println("\n");  
15.   
16.      System.out.println("----------孙权的追兵来了,使用第三个锦囊---------------");  
17.      context.setStrategy(new BlackEnemy());  
18.      context.operate();  
19.      System.out.println("\n");  
20.      }  
21. }

三招下来,搞得的周郎是“赔了夫人又折兵”。

以上就是策略模式,多种不同解决方案动态切换,起到改变对象行为的效果。

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 2 不喜欢 | 0
看完这篇文章有何感觉?已经有2人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程