当前位置: 首页 > news >正文

设计模式-策略模式、策略示例、策略模式对比工厂模式

1、简述

策略模式是对算法的封装,是一种行为模式,将每个算法封装到具有共同接口的独立类中,是算法本身和使用算法的客户端分离开,相互独立,从而使得他们可以相互替换

我们真实开发中会有很多这样类似的代码,这些不同的优惠方式,实际就是策略,使用策略模式就可以更优雅的实现代码

if("old".equals(discountType)){
  // 老用户优惠方式
  // ...
}else if("new".equals(discountType)){
    // 新用户优惠方式
    // ...
}else if("vip".equals(discountType)){
    // 会员用户优惠方式
    // ...
}else{
    // 等等其他用户优惠方式
    // ...
}

如上代码违背了

  • 单一职责原则:一个类只有1个发生变化的原因
    之后修改任何逻辑,当前方法都会被修改
  • 开闭原则:对扩展开放,对修改关闭
    任何的优惠方式的修改都要修改原代码,例如加入双11,618等节日优惠策略

特点

  • 可以减少大量的if else语句,可自动切换不同的实现
  • 扩展性强,添加策略无非就是增加一个具体的实现类而已,代价非常低

2、策略模式代码示例

public class DemoStrategy {

    public static void main(String[] args) {
    	// 模拟客户端调用
        String discountType = "old";

        if("old".equals(discountType)){
            // 老用户优惠策略
            ConditionFactory conditionFactory = new ConditionFactory(new ConditionOldStrategy());
            conditionFactory.next();
        }else if("new".equals(discountType)){
            // 新用户优惠策略
            ConditionFactory conditionFactory = new ConditionFactory(new ConditionNewStrategy());
            conditionFactory.next();
        }else if("vip".equals(discountType)){
            // vip客户
            ConditionFactory conditionFactory = new ConditionFactory(new ConditionVipStrategy());
            conditionFactory.next();
        }else{
            // ...
        }
    }
}

/**
 * 策略模式接口定义
 */
interface Strategy{
    // 抽象策略方法
    void discountStrategy();
}

/**
 * 老用户 优惠策略
 */
class ConditionOldStrategy implements Strategy{

    @Override
    public void discountStrategy() {

        System.out.println("old discount type");
    }
}
/**
 * 新客 优惠策略
 */
class ConditionNewStrategy implements Strategy{

    @Override
    public void discountStrategy() {

        System.out.println("new discount type");
    }
}
/**
 * vip 优惠策略
 */
class ConditionVipStrategy implements Strategy{

    @Override
    public void discountStrategy() {
        System.out.println("vip discount type");
    }
}

/**
 * 策略工厂
 */
class ConditionFactory{
    /**
     * 持有策略引用
     */
    private Strategy strategy;

    /**
     * 注入构造器
     * @param strategy
     */
    ConditionFactory(Strategy strategy){
        this.strategy = strategy;
    }

    /**
     * 调用策略的具体实现方法
     */
    public void next(){

        this.strategy.discountStrategy();
    }
}

实际ConditionFactory对象创建过程可以定义一个枚举,在枚举类中进行绑定discountType类型

3、策略模式对比工厂模式

策略模式是一种策略一种行为,并不是一层不变的写法,主要内容:抽象策略类,具体策略

策略模式核心是如何更优雅的把这些算法组织起来,让客户端使用更便利,代码结构更清晰

虽然工厂模式与策略模式相似,工厂模式是一种创建模式,创建具体对象,对象的具体创建和具体客户使用无关

请查看工厂模式博文

相关文章:

  • 深入探讨go.mod +incompatible
  • maven的进阶学习
  • alluxio简单使用
  • Android基础入门教程——7.1.1 Android网络编程要学的东西与Http协议学习
  • 基于 R 语言的朴素贝叶斯介绍与实践
  • Android初学八之Android网络编程
  • Android 网络编程 记录
  • Vue.js核心技术解析与uni-app跨平台实战开发学习笔记 第13章 uni-app核心基础 13.3 常用特效
  • Oracle索引详解
  • R语言ggplot2可视化:去除可视化结果中的NA图例、删除缺失值图例
  • java生成带logo的二维码
  • RK平台UVC摄像头shell测试脚本
  • Kafka 0.11.0.2 安装备忘录
  • Radxa Rock 3a NPU调用指南
  • Java 线程中断、线程让步、线程睡眠、线程合并
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 【笔记】你不知道的JS读书笔记——Promise
  • 2017-08-04 前端日报
  • 230. Kth Smallest Element in a BST
  • Angular Elements 及其运作原理
  • ES6之路之模块详解
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • jQuery(一)
  • linux安装openssl、swoole等扩展的具体步骤
  • Magento 1.x 中文订单打印乱码
  • NSTimer学习笔记
  • PHP 7 修改了什么呢 -- 2
  • python 学习笔记 - Queue Pipes,进程间通讯
  • vue-router 实现分析
  • 安装python包到指定虚拟环境
  • 程序员该如何有效的找工作?
  • 工作中总结前端开发流程--vue项目
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 基于组件的设计工作流与界面抽象
  • 前端面试之闭包
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 湖北分布式智能数据采集方法有哪些?
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • (175)FPGA门控时钟技术
  • (2)(2.10) LTM telemetry
  • (独孤九剑)--文件系统
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (三分钟)速览传统边缘检测算子
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转载)从 Java 代码到 Java 堆
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET 表达式计算:Expression Evaluator
  • .Net 应用中使用dot trace进行性能诊断
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NET连接MongoDB数据库实例教程
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [ Linux Audio 篇 ] 音频开发入门基础知识