Java设计模式之策略模式

2022-08-27 12:58:44

Java策略模式

前言

今天在学习时遇到了Comparator,发现之前记忆的有些模糊了,便重新温习,发现了Comparator便使用了策略模式,所以又简单学习了策略模式,用本篇来简单记录。

一、策略模式是什么?

策论模式(StrategyPattern),简单地说就是对象动态切换不同“策略”,使对象有不同的行为。策略模式封装了变化。策略模式又叫算法簇模式。它定义了一系列的算法用来完成相同的工作。策略模式让算法独立于使用它的客户而独立变化。 ----大话设计模式

二、策略模式的简单实现

举个例子(用这个例子来分析上面的那句话):
打工人去工作,有很多出行方式,这些方式就是多种策略,这些方式都是为了去工作。

  • 由于有多种不同方式去工作,从Java面向对象思想出发,要封装变化,即定义一个接口
//去工作的方式接口interfaceGoToWork{voidway();}
  • 接下来就是具体方式
//方式一,坐公交去classByBusimplementsGoToWork{@Overridepublicvoidway(){
        System.out.println("坐公交去工作");}}//方式二,飞过去classFlyimplementsGoToWork{@Overridepublicvoidway(){
        System.out.println("起飞去工作");}}//方式三,走路过去classWalkimplementsGoToWork{@Overridepublicvoidway(){
        System.out.println("走路去工作");}}
  • 最后就是让方式独立于他的客户独立变化
classWorker{private GoToWork goToWork;publicWorker(GoToWork goToWork){this.goToWork=goToWork;}publicvoidsetStrategy(GoToWork goToWork){this.goToWork= goToWork;}publicvoidgo(){
        goToWork.way();}}

策略模式有一个Context上下文对象,起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。这里的上下文对象就是Worker

为什么要有它?或者说为什么我们不直接使用new Fly().way()来实现对策略的直接调用?

如果没有上下文的话,客户端就必须直接和具体的策略实现进行交互了,尤其是需要提供一些公共功能或者是存储一些状态的时候,会大大增加客户端使用的难度;引入上下文之后,这部分工作可以由上下文来完成,客户端只需要和上下文进行交互就可以了。这样可以让策略模式更具有整体性,客户端也更加的简单。通过Worker来调用更符合面向对象的思想

  • 测试代码:
publicclassTest{publicstaticvoidmain(String[] args){//选择走
        System.out.println("-----第一天-----");
        Worker worker=newWorker(newWalk());
        worker.go();//选择坐公交
        System.out.println("-----第二天-----");
        worker.setStrategy(newByBus());
        worker.go();//选择起飞
        System.out.println("-----第三天-----");
        worker.setStrategy(newFly());
        worker.go();}}
  • 结果:
-----第一天-----
走路去工作-----第二天-----
坐公交去工作-----第三天-----
起飞去工作
  • 简单类图:

在这里插入图片描述

在实践中,只要听到需要在不同情况下应用不同的业务或出现很多if else,就可以考虑使用策略模式来封装这种变化的可能性。

三、策略模式的优缺点

优点:

  1. 能动态改变对象的行为,方便扩展策略

缺点:

  1. 一个策略一个类,可能类会过多
  2. 上层模块(客户端)必须知道有哪些策略,然后才能决定使用哪个策略

四、参考

https://blog.csdn.net/jason0539/article/details/45007553
https://blog.csdn.net/u011240877/article/details/52346671
https://mp.weixin.qq.com/s/-dir_KEf7b18kBLqXm-VvA

  • 作者:小森、
  • 原文链接:https://blog.csdn.net/weixin_44759105/article/details/110891537
    更新时间:2022-08-27 12:58:44