Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >行为型模式:策略模式

行为型模式:策略模式

作者头像
LieBrother
发布于 2019-04-02 08:12:55
发布于 2019-04-02 08:12:55
40000
代码可运行
举报
文章被收录于专栏:LieBrotherLieBrother
运行总次数:0
代码可运行

十一大行为型模式之五:策略模式

简介

姓名:策略模式

英文名:Strategy Pattern

价值观:集计谋于一身

个人介绍

Define a family of algorithms,encapsulate each one,and make them interchangeable.

定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。

(来自《设计模式之禅》)

你要的故事

先看一张拍得不好看的图片

每天上完班回到家第一件事情是干啥?有人一进门就躺在沙发上闭目养神、有人一进门躺在沙发上玩手机、有人一进门就陪自己的小宠物玩等等。而我进门第一件事就是洗澡,洗完澡很容易就把一整天的疲惫感给消除掉,然后就可以开始美好的下班时光。现实没那么美好,洗完澡后还要洗衣服,大学手洗了 4 年的衣服,一出来工作,宿舍第一必需品就是洗衣机。细看洗衣机,有很多种洗衣类型,比如:标准、大物、快洗、轻柔。洗衣类型的区别在于洗衣服的过程不一样,洗衣过程包括有浸泡、洗涤、漂洗、脱水,还有洗衣服的时间也不一样。细想可以发现这 4 种洗衣类型其实是洗衣服的 4 种不同的策略,也即是 4 种不同的算法。根据这个思路,我们可以用代码实现它,定义一个接口 WashingStrategy 定义洗衣服类型,而这些类型都有各自的洗衣过程,比如标准洗衣类型就包括浸泡、洗涤、漂洗、脱水,而快洗则只包括洗涤、漂洗、脱水。而我们洗衣服则需要选择某个洗衣类型后,洗衣机就开始工作了。过程如下代码所示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class StrategyTest {

    public static void main(String[] args) {
        WashingStrategy washingStrategy = new StandardWashingStrategy();
        WashingMachine washingMachine = new WashingMachine(washingStrategy);
        washingMachine.washingClothes();
    }

}

/**
 * 洗衣类型
 */
interface WashingStrategy {
    void washing();
}

/**
 * 洗衣机
 */
class WashingMachine {
    private WashingStrategy washingStrategy;
    public WashingMachine(WashingStrategy washingStrategy) {
        this.washingStrategy = washingStrategy;
    }

    public void washingClothes() {
        this.washingStrategy.washing();
    }
}

/**
 * 标准
 */
class StandardWashingStrategy implements WashingStrategy{

    @Override
    public void washing() {
        System.out.println("标准流程:");
        System.out.println("[浸泡] 10 分钟");
        System.out.println("[洗涤] 2 次,每次 15 分钟");
        System.out.println("[漂洗] 1 次,每次 10 分钟");
        System.out.println("[脱水] 5 分钟");
        System.out.println("总共耗时:55 分钟");
    }
}

/**
 * 快洗
 */
class QuickWashingStrategy implements WashingStrategy {

    @Override
    public void washing() {
        System.out.println("快洗流程:");
        System.out.println("[洗涤] 1 次,每次 10 分钟");
        System.out.println("[漂洗] 1 次,每次 10 分钟");
        System.out.println("[脱水] 5 分钟");
        System.out.println("总共耗时:25 分钟");
    }
}

/**
 * 大物
 */
class BigClothesWashingStrategy implements WashingStrategy {

    @Override
    public void washing() {
        System.out.println("大物流程:");
        System.out.println("[浸泡] 30 分钟");
        System.out.println("[洗涤] 3 次,每次 15 分钟");
        System.out.println("[漂洗] 2 次,每次 10 分钟");
        System.out.println("[脱水] 5 分钟");
        System.out.println("总共耗时:100 分钟");
    }
}

/**
 * 轻柔
 */
class SoftWashingStrategy implements WashingStrategy {

    @Override
    public void washing() {
        System.out.println("轻柔流程:");
        System.out.println("[浸泡] 10 分钟");
        System.out.println("[漂洗] 2 次,每次 15 分钟");
        System.out.println("[脱水] 5 分钟");
        System.out.println("总共耗时:45 分钟");
    }
}

标准流程:
[浸泡] 10 分钟
[洗涤] 2 次,每次 15 分钟
[漂洗] 1 次,每次 10 分钟
[脱水] 5 分钟
总共耗时:55 分钟

是不是感觉策略模式很简单呢?上面代码就是完整的策略模式示例,是不是感觉有些问题,这 4 种洗衣类型对象完全暴露给了用户,这也是策略模式的缺点。往往策略模式不会单独使用,会和其他设计模式一起使用,比如和简单工厂模式一起使用就可以解决这个对外暴露对象的问题,看下面代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 洗衣类型选择
 */
class WashingFactory {

    public static WashingStrategy getWashingStrategy(String type) {
        if ("Quick".equals(type)) {
            return new QuickWashingStrategy();
        }
        if ("BigClothes".equals(type)) {
            return new BigClothesWashingStrategy();
        }
        if ("Soft".equals(type)) {
            return new SoftWashingStrategy();
        }
        return new StandardWashingStrategy();
    }
}

public class StrategyTest {

    public static void main(String[] args) {
        WashingStrategy washingStrategy2 = WashingFactory.getWashingStrategy("Soft");
        WashingMachine washingMachine2 = new WashingMachine(washingStrategy2);
        washingMachine2.washingClothes();
    }
}

打印结果:
轻柔流程:
[浸泡] 10 分钟
[漂洗] 2 次,每次 15 分钟
[脱水] 5 分钟
总共耗时:45 分钟

代码中使用 WashingFactory 来封装 4 种策略,使得策略没有对外暴露,我们也了解到设计模式之间具有互补的关系,有些时候并不是单独存在的。

代码:

https://github.com/1CSH1/DesignPatterns/blob/master/src/com/liebrother/designpatterns/strategy/

总结

策略模式是一个很好的封装各种复杂处理的设计模式,让使用者根据自己的选择来选中策略,而不用修改其他代码。当策略太多的时候,可能造成使用方变得复杂、难管理多个策略的问题,利用工厂方法模式可以很好的解决这个难题。这其中也是一个见招拆招的问题,设计模式在真正运用中也是这样子的,遇到问题使用恰当的设计模式去解决问题。

参考资料:《大话设计模式》、《设计模式之禅》

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-02-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 LieBrother 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Java SE】类和对象(上)
用户11369558
2024/11/20
1390
【Java SE】类和对象(上)
【Javase-9.类和对象】
java是一门纯面向对象的语言,在面向对象的世界里,一切皆为对象.面向对象是解决问题的一种思想,主要依靠对象之间的交互来完成一件事.
用户11369350
2024/11/19
940
【Javase-9.类和对象】
【Java篇】无形至有形,法与道的编织:类与对象初探
面向过程强调程序的执行流程,注重将问题拆解成一系列的操作步骤,每一步骤都必须严格按顺序执行。例如,传统的洗衣服过程要求依次完成浸泡、搓洗、漂洗、甩干等操作,任何一步出错都可能导致整体流程无法正常进行。
半截诗
2025/03/18
880
【Java篇】无形至有形,法与道的编织:类与对象初探
Python基础(二十):面向对象基础
手洗:找盆 - 放水 - 加洗衣粉 - 浸泡 - 搓洗 - 拧干水 - 倒水 - 漂洗N次 - 拧干 - 晾晒。
Lansonli
2023/01/20
5090
Python基础(二十):面向对象基础
python 异步 async/await -1.一文理解什么是协程
前言 Python 在 3.5 版本中引入了关于协程的语法糖 async 和 await, 在 python3.7 版本可以通过 asyncio.run() 运行一个协程。 所以建议大家学习协程的时候使用 python3.7+ 版本,本文示例代码在 python3.8 上运行的。 什么是协程? 网上有个关于洗衣机的例子,写的挺好的,借用下 假设有1个洗衣房,里面有10台洗衣机,有一个洗衣工在负责这10台洗衣机。那么洗衣房就相当于1个进程,洗衣工就相当1个线程。如果有10个洗衣工,就相当于10个线程,1个进
上海-悠悠
2022/05/13
5.5K0
策略模式
策略设计模式难易程度应该是仅次于单例模式的,无论是实现起来还是从结构上看,都非常简单,他跟简单工厂都一部分思想类似,大家可以结合一下简单工厂来看策略模式,大家千万不要记混了哦。
胖虎
2019/06/26
4930
策略模式
Java基础-Day07,面向对象的认识
对于面向过程的思想:当需要实现一个功能的时候,看中的是每一个步骤怎么做,整体的过程是怎样的。每一个操作都需要自己亲力亲为。
软件小生活
2021/08/16
2830
Python基础之面向对象基础知识
手洗:找盆 - 放水 - 加洗衣粉 - 浸泡 - 搓洗 - 拧干水 - 倒水 - 漂洗N次 - 拧干 - 晾晒。
海仔
2020/08/17
4210
设计模式-策略模式
一个类的行为或其算法可以在运行时更改,我们把它降维到代码层面。 用人话翻译一下就是,运行时我给你这个类的方法传不同的“key”,你这个方法会执行不同的业务逻辑。 细品一下,这不就是 if else 干的事吗?
才疏学浅的木子
2024/04/15
1790
设计模式-策略模式
策略模式
高爽
2017/12/28
5190
策略模式
轻松理解 Python 中的 async await 概念
写这篇文章是受 xinghun85 的这篇博客 的启发, 但是人家后面写的东西跳跃太快, 有点没看懂, 自己在此做一个补充.
全栈程序员站长
2022/09/14
7860
【地铁上的设计模式】--行为型模式:策略模式
策略模式是一种行为型设计模式,它允许在运行时选择算法的行为。这种模式通过定义一系列算法,并将每个算法封装到一个独立的类中,使得它们可以相互替换。通过这种方式,客户端可以根据需要选择要使用的算法,而不必与特定算法相关的实现细节耦合在一起。 策略模式适用于需要根据特定条件在多种算法之间进行切换的场景。它可以使代码更具可读性和可维护性,同时还能提高代码的灵活性和可扩展性。它还可以将算法的实现细节与客户端代码分离开来,从而使得算法可以更容易地进行修改和维护。 然而,使用策略模式可能会导致类的数量增加,从而增加代码的复杂性。此外,使用策略模式时,客户端必须了解不同策略之间的区别,以便能够选择正确的策略。因此,策略模式适用于复杂的场景,而不适用于简单的问题。
喵叔
2023/05/13
3060
知识改变命运 第八集(上):Java中的类和对象
Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面 向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人 们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好
用户11319080
2024/10/17
1710
知识改变命运 第八集(上):Java中的类和对象
设计模式 | 行为型 | 策略模式
策略模式定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。使算法的变化独立于使用它们的客户端。
被水淹没
2023/02/25
3670
设计模式 | 行为型 | 策略模式
你真的懂怎么写`服务层`吗?
其实很多系统架构里面都有服务层,但是服务对很多开发人员来说都有很多不同的定义和写法。甚至在我待过的公司里都有不同的写法和编写模式。每个人每个团队每个项目都有对服务不同的理解。那到底什么是服务,怎么理解才是对的呢?
三钻
2020/10/29
4260
你真的懂怎么写`服务层`吗?
Spring Boot 项目怎么使用策略模式?
策略模式是一种设计模式,允许在运行时选择算法或行为的模式。其核心思想是定义一系列算法,把它们一个个封装起来,并使它们可以互相替换。这种模式能够根据不同的情况动态地选择最合适的算法。
阿珍
2024/08/05
2420
Spring Boot 项目怎么使用策略模式?
Java类与对象详解
Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下,使用Java语言去设计、开发计算机程序。 这里的对象泛指现实中一切事物,每种事物都具备自己的属性和行为。面向对象思想就是在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽象出来,描述成计算机事件的设计思想。 它区别于面向过程思想,强调的是通过调用对象的行为来实现功能,而不是自己一步一步的去操作实现。
共饮一杯无
2022/11/28
3510
Java类与对象详解
透过源码学习设计模式5—状态模式和Spring状态机
状态模式即允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类,换句话说状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。
java达人
2019/08/15
5.3K0
策略模式
最近有一个学妹在跟我沟通如何有效的去避免代码中一长串的if else判断或者switch条件判断?针对更多的回答就是合理的去使用设计来规避这个问题。
敖丙
2021/07/02
5490
「聊设计模式」之策略模式(Strategy)
🏆本文收录于《聊设计模式》专栏,专门攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎持续关注&&收藏&&订阅!
bug菌
2023/11/20
9170
「聊设计模式」之策略模式(Strategy)
相关推荐
【Java SE】类和对象(上)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验