设计模式16——策略模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。

策略模式(Strategy)

是一种行为型模式。

目录

一、概述

1.1、直观的理解:

1.2、适用场景:

1.3、主要的角色:

1.4、描述对象关系的UML图如下:

二、代码示例

2.1、对象之间的关系用UML图表示如下:

2.2、Java版的代码如下:


一、概述

复制代码
1、定义算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。

1.1、直观的理解

以商场购物活动为例,商场经常在一些特殊的日子里做各种不同的促销活动,那么不同的促销打折方式就可以当做一种不同的策略,其中原价、打折、满减都是具体的策略,如下:

除此之外:

1.2、适用场景:

  • 许多相关的类仅仅是具体实现上有差异
  • 需要使用一个算法的不同变体
  • 算法中的一些数据不应该让客户知道
  • 一个类使用条件语句定义了多种行为,可以把这些行为分别封装起来

(注:上述最后一点,书上说可以减少一些条件语句,我的理解是针对客户来说是可以减少的,而不是说真的完全不需要编写条件语句了,比如可以使用策略模式+简单工厂模式,将条件判断放到策略工厂里,客户只需要给策略工厂传递参数即可,由策略工厂判断该实例化哪个策略并且运行。)

1.3、主要的角色:

  • 策略类:++策略抽象类或接口++ + ++具体的策略类(多个)++
  • ++上下文类++:先给上下文类填装一个具体策略实例对象,然后就可以通过它来访问策略类

1.4、描述对象关系的UML图如下:

二、代码示例

假设每次要从3个不同的算法挑一个使用,问题简单就不再分析了,你可以把这当做一个模板,方便灵活使用:

2.1、对象之间的关系用UML图表示如下:

2.2、Java版的代码如下:

策略类的接口:

java 复制代码
public interface Strategy {
    public void algorithmInterface();
}

具体策略类1:

java 复制代码
public class ConcreteStrategy1 implements Strategy {
    @Override
    public void algorithmInterface() {
        System.out.println("算法1实现!");
    }
}

具体策略类2:

java 复制代码
public class ConcreteStrategy2 implements Strategy {
    @Override
    public void algorithmInterface() {
        System.out.println("算法2实现!");
    }
}

具体策略类3:

java 复制代码
public class ConcreteStrategy3 implements Strategy {
    @Override
    public void algorithmInterface() {
        System.out.println("算法3实现!");
    }
}

上下文类:

java 复制代码
public class Context {
    Strategy strategy;

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

    public void contextInterface() {
        strategy.algorithmInterface();
    }
}

主程序(发起请求的类):

java 复制代码
public class Main {
    public static void main(String[] args) {
        Context context;
        context = new Context(new ConcreteStrategy1());
        context.contextInterface();

        context = new Context(new ConcreteStrategy2());
        context.contextInterface();

        context = new Context(new ConcreteStrategy3());
        context.contextInterface();
    }
}

这里暂时就不再例其它编程语言的例子了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。

如果觉得本文还不错,就请点个赞给作者一点鼓励吧!如果有建议,也请评论指教和讨论!

相关推荐
fakerth11 小时前
【OpenHarmony】设计模式模块详解
c++·单例模式·设计模式·openharmony
alibli14 小时前
一文学会设计模式之创建型模式及最佳实现
c++·设计模式
1024肥宅16 小时前
前端常用模式:提升代码质量的四大核心模式
前端·javascript·设计模式
郝学胜-神的一滴20 小时前
设计模式依赖于多态特性
java·开发语言·c++·python·程序人生·设计模式·软件工程
帅次20 小时前
系统分析师:软件需求工程的软件需求概述、需求获取、需求分析
设计模式·重构·软件工程·团队开发·软件构建·需求分析·规格说明书
EXtreme3521 小时前
【数据结构】算法艺术:如何用两个栈(LIFO)优雅地模拟队列(FIFO)?
c语言·数据结构·算法·设计模式·栈与队列·摊还分析·算法艺术
1024肥宅2 天前
JavaScript常用设计模式完整指南
前端·javascript·设计模式
特立独行的猫a2 天前
C++观察者模式设计及实现:玩转设计模式的发布-订阅机制
c++·观察者模式·设计模式
better_liang2 天前
每日Java面试场景题知识点之-单例模式
java·单例模式·设计模式·面试·企业级开发
sg_knight2 天前
什么是设计模式?为什么 Python 也需要设计模式
开发语言·python·设计模式