Java特性之设计模式【策略模式】

一、策略模式

概述

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法

主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护

何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为

策略模式一般用于各种算法上面

优缺点

优点:

1、算法可以自由切换

2、避免使用多重条件判断

3、扩展性良好

缺点:

1、策略类会增多

2、所有策略类都需要对外暴露

1. 各个角色介绍

1.1 策略类(Strategy

策略是一个接口,该接口定义若干个操作标识,即定义了若干个方法

1.2 环境类 / 策略上下文类(Context)

上下文提供一个方法(如下图Context类中的的 executeStrategy() 方法),持有一个策略类的引用,最终给客户端调用。该方法委托策略变量调用具体策略所实现的策略接口中的方法(实现接口的类重写策略中的方法,来完成具体功能)

1.3 具体策略类(ConcreteStrategy)

具体策略是实现策略接口的类(如下图的ConcreteStrategyA类和ConcreteStrategyB类)。具体策略实现策略接口所定义的方法,即给出操作标识的具体方法

2. UML图

在这里插入图片描述

3. 具体例子和代码

角色分配

  • Strategy:策略接口
    • OperationAdd:加法策略(实现策略接口)
    • OperationSubtract:减法策略(实现策略接口)
    • OperationMultiply:乘法策略(实现策略接口)
    • OperationDivision:除法策略(实现策略接口)
  • Context:策略上下文

3.1 策略接口以及实现类

  • Strategy
package com.vinjcent.pattern.strategy;

/**
 * @author vinjcent
 * @description 策略接口
 */
public interface Strategy {

    /**
     * 实现该接口的方法
     * @param num1  数值1
     * @param num2  数值2
     * @return      计算结果
     */
    int doOperation(int num1, int num2);
    
}

  • OperationAdd
package com.vinjcent.pattern.strategy;

/**
 * @author vinjcent
 * @description 加法策略
 */
public class OperationAdd implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 + num2;
    }
}

  • OperationSubtract
package com.vinjcent.pattern.strategy;

/**
 * @author vinjcent
 * @description 减法策略
 */
public class OperationSubtract implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 - num2;
    }
}
  • OperationMultiply
package com.vinjcent.pattern.strategy;

/**
 * @author vinjcent
 * @description 乘法策略
 */
public class OperationMultiply implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 * num2;
    }
}
  • OperationDivision
package com.vinjcent.pattern.strategy;

/**
 * @author vinjcent
 * @description 除法策略
 */
public class OperationDivision implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 / num2;
    }
}

3.2 策略上下文类

  • Context
package com.vinjcent.pattern.strategy;

/**
 * @author vinjcent
 * @description 策略上下文
 */
public class Context {

    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public Strategy getStrategy() {
        return strategy;
    }

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public int executeStrategy(int num1, int num2) {
        return strategy.doOperation(num1, num2);
    }
}

3.3 测试主函数


package com.vinjcent.pattern.strategy;

/**
 * @author vinjcent
 */
public class Main {

    public static void main(String[] args) {
        // 策略上下文
        Context context = new Context(new OperationAdd());
        // 加法策略
        System.out.println("10 + 5 = " + context.executeStrategy(10, 5));

        // 减法策略
        context = new Context(new OperationSubtract());
        System.out.println("10 - 5 = " + context.executeStrategy(10, 5));

        // 乘法策略
        context = new Context(new OperationMultiply());
        System.out.println("10 * 5 = " + context.executeStrategy(10, 5));

        // 除法策略
        context = new Context(new OperationDivision());
        System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
    }
}


  • 测试结果

在这里插入图片描述

4. 使用场景

  • 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为
  • 一个系统需要动态地在几种算法中选择一种
  • 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现

注意事项:

如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题

在这里插入图片描述

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
资源介绍 本次为大家带来的资源是“基于Spring Boot开发的医院信息管理系统”的毕业设计项目,包含完整的源代码、论文以及详尽的说明文档。该项目是一个集现代化信息技术与医疗管理于一体的综合性系统,旨在提高医院工作效率,优化患者就医体验。 该系统基于Spring Boot框架开发,充分利用了Spring Boot的轻量级、快速开发以及易于维护的特性。系统实现了患者信息管理、医生工作站、药品管理、预约挂号、报告查询等功能模块,覆盖了医院日常运营管理的各个方面。同时,系统采用了前后端分离的开发模式,前端使用现代化的UI框架,后端提供RESTful API接口,保证了系统的可扩展性和可维护性。 除了基本的业务功能外,该系统还注重数据的安全性和隐私保护。通过数据加密、权限控制等手段,确保患者和医院数据的安全可靠。此外,系统还提供了丰富的数据分析和统计功能,帮助医院管理层更好地了解运营状况,制定科学的管理策略。 此毕业设计项目不仅是一个完整的信息管理系统,更是一个具有很高实用价值的学习案例。源代码清晰规范,注释详尽,非常适合作为学习Spring Boot和医院信息管理系统的参考资料。同时,项目具有高度的可定制性和二次开发潜力,可以根据实际需求进行功能扩展和优化。 总的来说,这份资源不仅对于即将进行毕业设计的同学具有很高的参考价值,也对于希望了解医院信息管理系统开发的技术人员来说是一份不可多得的宝贵资料。
策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在策略模式中,我们创建表示各种策略的对象和一个上下文对象,该对象可以根据其策略对象的不同行为而更改其执行算法。 以下是Java策略模式的示例代码: 首先,我们定义一个策略接口,该接口定义了一个方法calculate(),该方法将由具体策略类实现: ```java public interface Strategy { public int calculate(int num1, int num2); } ``` 然后,我们实现两个具体策略类,它们实现了策略接口并提供了自己的实现: ```java public class AddStrategy implements Strategy { public int calculate(int num1, int num2) { return num1 + num2; } } public class SubtractStrategy implements Strategy { public int calculate(int num1, int num2) { return num1 - num2; } } ``` 接下来,我们定义一个上下文类,该类将使用策略接口来执行算法: ```java public class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public int executeStrategy(int num1, int num2) { return strategy.calculate(num1, num2); } } ``` 最后,我们可以在客户端代码中使用上下文对象来执行算法: ```java public class Client { public static void main(String[] args) { Context context = new Context(new AddStrategy()); System.out.println("10 + 5 = " + context.executeStrategy(10, 5)); context = new Context(new SubtractStrategy()); System.out.println("10 - 5 = " + context.executeStrategy(10, 5)); } } ``` 输出结果为: ``` 10 + 5 = 15 10 - 5 = 5 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naijia_OvO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值