一起来了解Java的策略模式

目录
  • 策略模式
    • 1、什么是策略模式
    • 2、策略模式的优缺点
    • 3、策略模式的结构
    • 4、代码实现
    • 5、策略模式的应用场景
  • 总结

策略模式

策略模式属于Java 23种设计模式中行为模式之一,那先看看什么是策略模式。

1、什么是策略模式

策略模式的定义:

该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。

其实我们在现实生活中常常遇到实现某种目标存在多种策略可供选择的情况,例如,出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等。或者比如网购,你可以选择工商银行、农业银行、建设银行等等,但是它们提供的算法都是一致的,就是帮你付款。

在软件开发中也会遇到相似的情况,当实现某一个功能存在多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。(这个在下面案例中详讲)

图解:

2、策略模式的优缺点

优点:

  • 多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句
  • 提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码
  • 提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的
  • 提供了对开闭原则的完美支持,可以在不修改原代码的情况下,灵活增加新算法把算法
  • 的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离

缺点:

  • 客户端必须理解所有策略算法的区别,以便适时选择恰当的算法类
  • 策略模式造成很多的策略类,增加维护难度

3、策略模式的结构

1.抽象策略类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。

2.具体策略类:实现了抽象策略定义的接口,提供具体的算法实现。

3.环境类:持有一个策略类的引用,最终给客户端调用。

结构图:

4、代码实现

现在有三只鸭子: 绿毛鸭、红毛鸭、小鸭子(小鸭子还不会飞)

现在定义一个鸭子的父类:里面有都会叫的方法,有显示外观的方法(因为每只都不一样,就需要子类重写)

还会飞行 (这里使用策略模式)

public  abstract class duck {
    //鸭子都会叫:
    public void quack(){
        System.out.println("嘎嘎嘎");
    }
    //鸭子的外观,因为都不一样,所以由子类去实现
    public abstract void display();

	//以下使用策略模式:
    //在父类中持有该接口,并由该接口代替飞行行为(组合)
    private Flying flying;
    //提供set方法
    public void setFlying(Flying flying) {
        this.flying = flying;
    }
    public void fly(){
        flying.Fly();
    }
}

定义一个飞行接口:

/**
 * 策略接口:实现了鸭子的飞行行为
 */
public interface Flying {
    void Fly();
}

我们知道策略模式就是把需要用的算法封装起来,就在另一个内封装了会飞不会飞的两个方法:

会飞(继承至上面的飞行接口,重写飞行方法):

public class FlyWithWin implements Flying {
    @Override
    public void Fly() {
        System.out.println("我会飞");
    }
}

不会飞:

public class FlyNoWay implements Flying {
    @Override
    public void Fly() {
        System.out.println("我不会飞行");
    }
}

注意: 上面这两个方法我是把他们单独封装起来,当做算法族,然后程序需要使用里面某个算法的时候,程序不会受算法改变的影响,因为这里面的算法最终效果是一致的

红毛鸭类:

/**
 * 红色鸭子
 */
public class RedDuck extends duck{
    public RedDuck(){
        super();
        //给鸭子注入飞行的能力,这里就是通过算法族里面的会飞的算法
        super.setFlying(new FlyWithWin());
    }
    @Override
    public void display() {
        System.out.println("我是红色的鸭子");
    }
}

绿毛鸭:

/**
 *
 * 绿色鸭子
 */
public class GreenDuck extends duck{
    public GreenDuck(){
        super();
        //给鸭子注入飞行的能力,这里也是通过算法族里面的会飞的算法
        super.setFlying(new FlyWithWin());
    }
    @Override
    public void display() {
        System.out.println("我是绿色的鸭子");
    }
}

小鸭子类(不会飞):

/**
 * 小鸭子,还不会飞
 */
public class SamllDuck extends duck{
    public SamllDuck(){
        super();
        //小鸭子不会飞,所以使用了算法族里面不会飞的算法
        super.setFlying(new FlyNoWay());
    }

    @Override
    public void display() {
        System.out.println("我还是小鸭子");
    }
    //因为小鸭子和大鸭子的叫声不一样,所以重写叫声方法
    public void quack(){
        System.out.println("嘎~嘎~嘎");
    }
}

测试类:

public class Test {
    public static void main(String[] args) {
        System.out.println("***测试鸭子程序***");
        duck d = null;
		//这下面是轮流运行!!!!
        d = new RedDuck();  //测试红色的鸭子
        d = new GreenDuck();  //测试绿色的鸭子
        d = new SamllDuck();  //测试小鸭子
        d.display();
        d.quack();
        d.fly();
        System.out.println("***测试完毕***");
    }
}

当使用红毛鸭为对象时:

***测试鸭子程序***
我是红色的鸭子
嘎嘎嘎
我会飞
***测试完毕***

当使用绿毛鸭为对象时:

***测试鸭子程序***
我是绿色的鸭子
嘎嘎嘎
我会飞
***测试完毕***

当使用小鸭子为对象时:

***测试鸭子程序***
我还是小鸭子
嘎~嘎~嘎
我不会飞行
***测试完毕***

5、策略模式的应用场景

1.一个系统需要动态地在几种算法中选择一种时,可将每个算法封装到策略类中

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

3.系统中各算法彼此完全独立,且要求对客户隐藏具体算法的实现细节时

4.系统要求使用算法的客户不应该知道其操作的数据时,可使用策略模式来隐藏与算法相关的数据结构

5.多个类只区别在表现行为不同,可以使用策略模式,在运行时动态选择具体要执行的行为

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Java使用策略模式实现聚石塔接口调用的问题

    背景 有个业务需求对接淘宝开放平台.这里面涉及到了聚石塔,聚石塔是阿里系的一款产品,可以理解为一个服务器,淘宝开发平台一些较为敏感的数据,会要求发布进聚石塔.外部需要调用要通过走奇门网关.奇门中心也有详细描述. 研究了一下文档发现,需要写两套代码: 1.第一套适配聚石塔接口,发布在聚石塔内: 2.更新最新的SDK,放在第二套代码,通过SDK里面的奇门调用 写代码之前还需要在奇门中心配置好自定义api场景,并且规定好统一的入参以及响应  重点!!聚石塔内,一个appKey在一个场景内,只能授权配置

  • 深入理解Java设计模式之策略模式

    目录 一.什么是策略模式 二.策略模式的结构 三.策略模式的应用场景 四.策略模式的优缺点 六.策略模式的实现 七.策略模式和简单工厂模式的结合 八.策略枚举的实现 九.总结 一.什么是策略模式 策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户.需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅助类),提供辅助函数. 策略模式定义和封装了一系列的算法,它们是可以相互替换的,也就是说它们具有

  • Java中常用的设计模式之策略模式详解

    目录 优点 缺点 使用场景 一.实现方式 1.订单类型枚举类 2.订单处理接口 3.普通订单处理器 4.秒杀订单处理器 5.拼团订单处理器 6.下单管理器 二.测试 1.引入依赖 2.测试用例 总结 优点 1.算法可以自由切换. 2.避免使用多重条件判断. 3.扩展性良好. 缺点 1.策略类会增多. 2.所有策略类都需要对外暴露. 使用场景 1.如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为. 2.一个系统需要动态地在几种

  • Java利用策略模式实现条件判断,告别if else

    目录 定义 使用场景 案例 需求 实现方案 方案分析 总结 定义 策略模式定义了一系列算法,并且将每个算法封装起来,使得他们可以相互替换,而且算法的变化不会影响使用算法的客户端. 使用场景 一个系统需要动态的在几种算法中选择一种,可以把每个算法封装到具体的策略类中 一个类中定义了多种行为,可以去代替条件转移语句,减少硬编码 系统中各个算法或者说函数是彼此独立的,而且要求对客户隐藏算法具体实现细节的时候 多个类只区别在表现行为的不同,可以使用策略模式,在运行时动态的选择要执行的行为 案例 需求 根

  • Java策略模式取代if else

    别再大量的if else了, 代码太简陋了, 可读性太差了. 策略模式的定义 .... 简单来说 每个模块相互独立 互不影响 提高代码的可扩展性 ! 举栗子, 如下烂代码 if ("花呗支付".equals(type)) { // 花呗支付的业务逻辑处理 } else if ("微信支付".equals(type)) { // 微信支付业务逻辑 } else if ("云闪付".equals(type)) { // 云闪付支付业务逻辑 } els

  • Java设计模式之java策略模式详解

    目录 为什么使用策略模式? 策略模式包含角色 策略模式的类图 排序案例 策略模式的优点 策略模式的缺点 适用场景 源码分析策略模式的典型应用 Java Comparator 中的策略模式 参考文章 总结 为什么使用策略模式? 实现某一个功能有多条途径,每一条途径对应一种算法,此时我们可以使用一种设计模式来实现灵活地选择解决途径,也能够方便地增加新的解决途径. 策略模式包含角色 Context(环境类):环境类是使用算法的角色,它在解决某个问题(即实现某个方法)时可以采用多种策略.在环境类中维持一

  • java 使用策略模式操作JDBC数据库

    java 使用策略模式操作JDBC数据库 1:构造一个操作数据库的工具类,可以获得连接和释放连接 public class DBUtil { private static Connection conn = null; static { //静态初始块 try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tes

  • Java使用策略模式解决商场促销商品问题示例

    本文实例讲述了Java使用策略模式解决商场促销商品问题.分享给大家供大家参考,具体如下: 一 模式定义 策略模式:定义一系列的算法,将每一种算法封装起来并可以相互替换使用,策略模式让算法独立于使用它的客户应用而独立变化. 二 模式举例 1 模式分析 我们借用商场促销商品来说明这一模式. 2 策略模式静态类图 3 代码示例 3.1 创建策略接口一IStrategy package com.demo.strategy; /** * 策略接口 * * @author * */ public inter

  • Java之策略模式比较器案例讲解

    Comparable 比较器,内置定义的比较方法,实现比较 较简单 Comparator 策略模式,需要定义不同的策略和比较的对象,实现比较 较复杂 打个比方,狗有foot一种属性我们用Comparable比较器完成比较 猫有height和weight两种属性,我们用Comparator策略模式完成比较 一.Comparable --狗比较 缺点:自定义排序规则,规则定义好之后,再改起来就不方便,还需要重新开发Sort比较类 1.狗对象 package com.longze.guosh.stra

  • java设计模式策略模式图文示例详解

    目录 策略模式 意图 问题 解决方案 真实世界类比 策略模式结构 伪代码 策略模式适合应用场景 实现方式 策略模式优缺点 策略模式优缺点 与其他模式的关系 策略模式 亦称:Strategy 意图 策略模式是一种行为设计模式,它能让你定义一系列算法,并将每种算法分别放入独立的类中,以使算法的对象能够相互替换. 问题 一天,你打算为游客们创建一款导游程序.该程序的核心功能是提供美观的地图,以帮助用户在任何城市中快速定位. 用户期待的程序新功能是自动路线规划:他们希望输入地址后就能在地图上看到前往目的

  • 一起来了解Java的策略模式

    目录 策略模式 1.什么是策略模式 2.策略模式的优缺点 3.策略模式的结构 4.代码实现 5.策略模式的应用场景 总结 策略模式 策略模式属于Java 23种设计模式中行为模式之一,那先看看什么是策略模式. 1.什么是策略模式 策略模式的定义: 该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户.策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理. 其实我们在现实生活中常常

  • java设计模式--策略模式详解

    目录 策略模式 Demo 代码: 总结 策略模式 策略模式(Strategy Pattern)属于行为型模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法.用算法族分别封装起来,实现同一个接口,让他们之间可以互相替换,让算法的变化独立于使用算法的客户. 主要解决:在有多种算法相似的情况下,使用 if-else 所带来的复杂和难以维护. 如何解决:将这些算法封装成一个一个的类,任意地替换. 何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为. 使用场景: 如果在一个系统

  • java实现策略模式使用示例

    思路如下: 使用interface来定义一个接口,在该接口中定义save()方法:根据图片格式定义不同的类,分别在这些类中使用关键字implements实现接口:创建一个实现选择的类,在该类中定义实现选择的方法,该方法返回值为对应的图片保存类:在主方法中实现接口.代码如下: 复制代码 代码如下: public interface ImageSaver {    void save();//定义save()方法} public class GIFSaver implements ImageSave

  • Java利用策略模式优化过多if else代码

    前言 不出意外,这应该是年前最后一次分享,本次来一点实际开发中会用到的小技巧. 比如平时大家是否都会写类似这样的代码: if(a){ //dosomething }else if(b){ //doshomething }else if(c){ //doshomething } else{ ////doshomething } 条件少还好,一旦 else if 过多这里的逻辑将会比较混乱,并很容易出错. 比如这样: 摘自cim中的一个客户端命令的判断条件. 刚开始条件较少,也就没管那么多直接写的:

随机推荐