Java设计模式(十三)之行为型模式:策略模式

Java设计模式(十三)之行为型模式:策略模式

一、背景:

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

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

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

解决方法:就是使用策略模式。

 

二、策略模式定义:

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

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

UML结构图:

Java设计模式(十三)之行为型模式:策略模式

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

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

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

 

三、代码实现:

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

抽象策略类(Strategy):

public interface Strategy {
     public void operate();
}

三个实现类(ConcreteStrategy):

//妙计一:初到吴国
public class BackDoor implements IStrategy {
     @Override
     public void operate() {
          System.out.println("找乔国老帮忙,让吴国太给孙权施加压力,使孙权不能杀刘备");
     }
}

//求吴国太开绿灯放行
public class GivenGreenLight implements IStrategy {
     @Override
     public void operate() {
          System.out.println("求吴国太开个绿灯,放行");
     }
}

//孙夫人断后,挡住追兵
public class BlackEnemy implements IStrategy {
     @Override
     public void operate() {
          System.out.println("孙夫人断后,挡住追兵");
     }
}

环境类(Context):

public class Context {
     private Strategy strategy;
     //构造函数,要你使用哪个妙计
     public Context(Strategy strategy){
          this.strategy = strategy;
     }
     public void setStrategy(Strategy strategy){
          this.strategy = strategy;
     }
     public void operate(){
          this.strategy.operate();
     }
}

下面就是使用的情况了:

public class Zhaoyun {
 
public static void main(String[] args) {
     Context context;
 
     System.out.println("----------刚到吴国使用第一个锦囊---------------");
     context = new Context(new BackDoor());
     context.operate();
     System.out.println("\n");
 
     System.out.println("----------刘备乐不思蜀使用第二个锦囊---------------");
     context.setStrategy(new GivenGreenLight());
     context.operate();
     System.out.println("\n");
 
     System.out.println("----------孙权的追兵来了,使用第三个锦囊---------------");
     context.setStrategy(new BlackEnemy());
     context.operate();
     System.out.println("\n");
     }
}

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

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

 

四、小结:

1、优点:

(1)可以动态改变对象的行为;

2、缺点:

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

(2)策略模式将产生很多策略类。

3、适用场景:

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

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

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

原博客链接:

https://blog.csdn.net/jason0539/article/details/45007553

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100063.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • visdom简易教程

    visdom简易教程如果想用pytorch来做神经网络学习和训练,那么不管想不想,你都得学visdom这个可视化工具,因为别人全部用这个玩意在进行可视化显示,如果不会用有时甚至别人的代码都跑不起来。这里这么说似乎显得有点怨念,这是真的,因为本人一开始并不想要去搞它。但后来学着学着发现这真是个神器,难怪那么多人一上来直接要求先装上这个。要用这个先要安装,对于python模块而言,安装都是蛮简单的:pipinsta…

    2022年6月26日
    23
  • RUST开服教程、常用指令及心得[通俗易懂]

    RUST开服教程、常用指令及心得[通俗易懂]【前言】【开始前你需要了解的事情】①常用网址②更新与删档日期③目前国服环境【服务器硬件的选择】【标准服务器】①下载和更新服务器②制作服务器的启动脚本③选择你的服务器地图④运行服务器【模组服务器】①完成标准服务器的下载和设置②安装Oxide插件平台③下载插件④安装插件⑤调试插件⑥模组服的更新⑦在标准服中使用插件功能【在自己的电脑上运行服务端】①…

    2022年7月14日
    76
  • eigen库使用_eigen3

    eigen库使用_eigen3Eigen库的安装1.VisualStudio2017安装eigen库1.1下载eigen库1.2配置1.3运行测试1.VisualStudio2017安装eigen库1.1下载eigen库eigen官网下载地址找到自己需要的版本下载,我下载的是3.3.9,箭头指向的zip。解压缩得到文件eigen-3.3.9,放到自己想放置的路径下(后面会引用此处的路径)。1.2配置在VS2017中新建一个空项目,取名为“eigen_demo”。输入以下测试

    2022年10月19日
    3
  • 详解composer的自动加载机制

    详解composer的自动加载机制

    2021年10月27日
    33
  • R 笔记 prophet[通俗易懂]

    R 笔记 prophet[通俗易懂]0理论部分论文笔记:ForecastingatScale(Prophet)_UQI-LIUWJ的博客-CSDN博客Prophet是一种基于加法模型预测时间序列数据的程序,其中非线性趋势、季节性以及假日效应相匹配。它最适用于具有强烈季节性和有几个季节历史数据的时间序列。Prophet对缺失数据和趋势变化具有鲁棒性,并且通常可以很好地处理异常值。…

    2022年6月18日
    68
  • 史上超强最常用SQL语句大全

    史上超强最常用SQL语句大全史上超强最常用SQL语句大全,)1)DDL–数据定义语言用来定义数据库对象:数据库,表,列等。关键字:create,drop,alter等2)DML–数据操作语言用来对数据库中表的数据进行增删改。关键字:insert,delete,update等3)DQL–数据查询语言用来查询数据库中表的记录(数据)。关键字:selewhere等4)DCL–数据控制语言用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT,REVOKE等

    2022年6月14日
    22

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号