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

浅析Java设计模式【3.4】——策略


title: 浅析Java设计模式【3.4】——策略
date: 2018-12-29 17:26:17
categories: 设计模式
description: 浅析Java设计模式【3.4】——策略

1. 目录

Celue-1

  • 1. 目录
  • 2. 概念
    • 2.1. 应用场景
    • 2.2. 优缺点
      • 2.2.1. 优点
      • 2.2.2. 缺点
  • 3. 模式结构
  • 4. 样例
    • 4.1. 定义策略
    • 4.2. 定义具体策略
    • 4.3. 定义上下文
    • 4.4. 实现效果

2. 概念

策略的设计模式属于行为型模式一种,通过定义的一套算法类,进行封装,让算法类之间可以相互替换,从而达到一种按照调用侧/实现侧去决定目标实现。策略模式可以最大程度的避免代码中 if else 以及 switch 语句。

2.1. 应用场景

  • 在需要多实现场景下,但只在算法或行为上略有差异
  • 在算法或行为上须自由完成切换
  • 需要解脱或者屏蔽多条件判断的场景

2.2. 优缺点

2.2.1. 优点

  • 算法或行为可自由切换
  • 避免在实现过程中,使用多重条件判断
  • 实现结构上具备扩展性良好和可读性

2.2.2. 缺点

  • 策略的基础条件随着业务增长会增多,可能存在臃肿
  • 不是很安全,因为所有的策略条件都对外暴露

3. 模式结构

策略模式 的实现包含三个组成部分,分别为 策略类具体策略类上下文

  • Strategy:策略类,用于定义所有支持算法的公共接口;
  • ConcreteStrategy:是具体策略类,封装了具体的算法或行为,继承于 Strategy
  • Context:是上下文,用一个 ConcreteStrategy 来配置,维护一个对 Strategy 对象的引用

STRATEGY

4. 样例

此处假定我们在商场购物,用户支付的环节,在用户支付过程中,我们可以选择 现金信用卡积分

4.1. 定义策略


public interface Payment {

    void payment();
}

4.2. 定义具体策略

  • 现金

public class Cash implements Payment{

    @Override
    public void payment() {
        System.out.println("现金付款");
    }
}

  • 信用卡

public class Credit implements Payment{

    @Override
    public void payment() {
        System.out.println("信用卡付款");
    }
}

  • 积分

public class Points implements Payment{

    @Override
    public void payment() {
        System.out.println("积分付款");
    }
}

4.3. 定义上下文

public class Shopping {

    private Payment payment;

    public Shopping(Payment payment) {
        this.payment = payment;
    }

    public void buyDesktop(){
        System.out.println("购买台式机");
        payment.payment();
    }

}

4.4. 实现效果


@DisplayName("策略应用")
@Test
public void testStrategy() {
    Payment payment = new Cash();
    Shopping shopping = new Shopping(payment);
    shopping.buyDesktop();
}

20220830152421

相关文章:

  • time,datetime模块时间序列讲解
  • Hive的JDBC操作
  • Axure8.0教程:自动带出邮箱
  • VUE+webrtc-streamer实现实时视频播放(监控设备-rtsp)
  • Java进阶常用的辅助类(CountDownLatch 减法计数器、CyclicBarrier 加法计数器、Semaphore 信号量)
  • HWI的安装及使用
  • 【数据库】MySQL(索引、数据结构、性能、锁、事务等)面试题
  • Cython代码加密, 使用 Cython 将 Python 代码编译为二进制(将整个Django项目编译成功并部署)
  • C# 程序开机自动启动
  • html2canvs的一些问题
  • 金仓数据库 KingbaseES 插件参考手册 S(3)
  • Flutter聊天布局之图片视频上传、显示、保存到相册
  • Deep Laplacian Pyramid Networks for Fast and Accurate Super-Resolution
  • 基于SSM框架实现学生管理系统
  • JavaScript聊天框插入表情: 点击表情时输入框失焦, 无法插入到输入框.
  • @angular/forms 源码解析之双向绑定
  • 【面试系列】之二:关于js原型
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • axios 和 cookie 的那些事
  • ES6之路之模块详解
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • IOS评论框不贴底(ios12新bug)
  • JavaScript DOM 10 - 滚动
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Service Worker
  • spring boot下thymeleaf全局静态变量配置
  • Vim 折腾记
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • vue数据传递--我有特殊的实现技巧
  • 半理解系列--Promise的进化史
  • 当SetTimeout遇到了字符串
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 将 Measurements 和 Units 应用到物理学
  • 前端存储 - localStorage
  • 前嗅ForeSpider采集配置界面介绍
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 我的业余项目总结
  • 一个完整Java Web项目背后的密码
  • 最近的计划
  • Java性能优化之JVM GC(垃圾回收机制)
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (007)XHTML文档之标题——h1~h6
  • (175)FPGA门控时钟技术
  • (笔试题)合法字符串
  • (二)斐波那契Fabonacci函数
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (接口封装)
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (转)EOS中账户、钱包和密钥的关系
  • .htaccess配置常用技巧
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • :O)修改linux硬件时间