我学会了,策略模式

简介: 策略模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。

前言

策略模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。

策略模式

使用场景:这种模式是将一个个算法、行为封装起来,然后通过切换的方式去使用这些算法、行为,最后进行最终的运算、执行。这种模式在生活种比较常见,比如 不同接口的螺丝刀、不同风格的衣服、不同款式的显示器等等,非常多。

理解:这是一种类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,很常见。使用这种设计模式的前提是,要先定义好功能接口,这样切换不同算法、行为时才能正常运行。这种设计模式本身就是为了减少过多的 if else冗余,所以功能接口的设计很重要,比如借助Map这样的数据结构,那么就更加方便了,甚至都不需要去封装类,直接封装成函数放入map中,根据不同的key来使用相应的函数。

namespace action_mode_03 {

    // 接口
    interface IPlay {
        buy(price: number): number
        run(): string

    }


    class Computer implements IPlay {
        price: number = 6000

        buy(price: number): number {
            // 打六折
            const finalPrice = this.price * 0.6
            return price  - finalPrice
        }

        run(): string {
            return '计算机开机 =======> 欢迎使用 windows10'
        }

    }

    class Pad implements IPlay {
        price: number = 10000

        run(): string {
            return '平板开机 =======> 欢迎使用 华为平板'
        }

        buy(price: number): number {
            // 打七五折
            const finalPrice = this.price * 0.75
            return price - finalPrice
        }
    }


    class TV implements IPlay {
        price: number = 3000

        run(): string {
            return '电视开机 =======> 欢迎使用 小米电视'
        }

        buy(price: number): number {
            // 打8折
            const finalPrice = this.price * 0.8
            return price - finalPrice
        }
    }

    // 操作类
    class Student {

        money: number

        constructor(money: number) {
            this.money = money
        }

        get(strategyType: StrategyType) {
            const strategy = new strategyList[strategyType]
            const result = strategy.buy(this.money)
            if (result < 0) {
                return '钱不够,购买失败'
            }
            return strategy.run()
        }
    }

    // 策略的枚举
    enum StrategyType {
        Computer,
        Pad,
        TV,
    }

    // 策略的定义
    const strategyList = {
        [StrategyType.Computer]: Computer,
        [StrategyType.Pad]: Pad,
        [StrategyType.TV]: TV,
    }

    const xiaoming = new Student(5000)

    console.log("小明买计算机", xiaoming.get(StrategyType.Computer))
    console.log("小明买平板电脑", xiaoming.get(StrategyType.Pad))
    console.log("小明买液晶电视机", xiaoming.get(StrategyType.TV))
}

目录
相关文章
|
10月前
|
弹性计算 安全 容灾
阿里云DTS踩坑经验分享系列|使用VPC数据通道解决网络冲突问题
阿里云DTS作为数据世界高速传输通道的建造者,每周为您分享一个避坑技巧,助力数据之旅更加快捷、便利、安全。本文介绍如何使用VPC数据通道解决网络冲突问题。
368 0
|
8月前
|
存储 人工智能 JSON
RAG Logger:专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、性能监控
RAG Logger 是一款专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、检索结果记录、LLM 交互记录和性能监控等功能。
354 7
RAG Logger:专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、性能监控
|
开发工具 Windows
Electron V8排查问题之构建 Electron 源码时遇到 dugite 下载失败如何解决
Electron V8排查问题之构建 Electron 源码时遇到 dugite 下载失败如何解决
141 0
|
12月前
|
存储 NoSQL 关系型数据库
数据存储架构的演进和实操(一)
数据存储架构的演进和实操(一)
|
机器学习/深度学习 人工智能 算法
阿里巴巴新模型EMO的技术原理
【2月更文挑战第10天】阿里巴巴新模型EMO的技术原理
1840 2
阿里巴巴新模型EMO的技术原理
|
存储 SQL 数据库
数据仓库原理(二)
数据仓库原理(二)
238 2
|
存储 缓存 Linux
探秘Linux块设备驱动程序:成为内核开发大师的第一步
探秘Linux块设备驱动程序:成为内核开发大师的第一步
977 1
|
Java 程序员 C++
【Java】Java与C++:比较与对比
【Java】Java与C++:比较与对比
396 0
|
Java
Gradle笔记 八 Gradle 插件(一)
Gradle笔记 八 Gradle 插件
333 0
|
资源调度 前端开发 Java
React Native 运行报错 Command failed_ gradlew.bat app_installDebug -PreactNativeDevServerPort=8081
React Native 运行报错 Command failed_ gradlew.bat app_installDebug -PreactNativeDevServerPort=8081
399 0