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

23种模式——策略模式

目录

策略模式

策略模式的收银软件

策略模式的特点

使用场景

优缺点

策略模式和工厂模式的结合


策略(Strategy)模式

本质:分离算法,选择实现。

策略模式:针对一组算法,将每一个算法封装到具有共同接口的独立的类中,使得它们可以互换。

使用策略模式可以把行为和环境分割开来。环境类Context负责查询要做什么,各种算法则在具体策略类(ConcreteStrategy)中提供。

当出现新的促销折扣或现有的折扣政策出现变化时,只需要实现新的策略类,并在客户端登记即可。

在这里插入图片描述

 环境(Context):有一个Strategy类的引用,和具体的策略类交互。
抽象策略(Strategy)角色:一个接口或抽象类,给出规范。
具体策略(ConcreteStrategy)角色:具体算法或行为。


上下文使用具体策略对象,具体策略对象也可以从上下文获取所需要的数据,因此,可以将上下文当做参数传递给具体策略对象。

上下文封装着具体策略对象需要的数据,具体策略对象通过回调上下文的方法来获取这些数据。

策略模式的收银软件

抽象类CashStrategy:定义收银的计算方法

CashContext角色:引用CashStrategy的一个实例

CashNormal是正常收费,CashRebate是打折收费,CashReturn是返利收费,是三个具体策略,客户端判断决定选择使用哪一个。

public abstract class CashStrategy {public abstract double acceptCash(double money);}
public class CashContext {private CashStrategy cs;public CashContext(CashStrategy cs) {this.cs = cs;}public double getResult(double money) {return cs.acceptCash(money);}}
public class CashNormal extends CashStrategy{@Overridepublic double acceptCash(double money) {// TODO Auto-generated method stubreturn money;}}
public class CashRebate extends CashStrategy{private double moneyRebate=0;public CashRebate(double moneyRebate) {this.moneyRebate = moneyRebate;}@Overridepublic double acceptCash(double money) {return money*moneyRebate;}}
public class CashRetrun extends CashStrategy{private double moneyCondition=0.0;private double moneyReturn=0.0;public CashRetrun(double moneyCondition, double moneyReturn) {this.moneyCondition = moneyCondition;this.moneyReturn = moneyReturn;}@Overridepublic double acceptCash(double money) {double result=money;if(money>moneyCondition)result=money-Math.floor(money/moneyCondition)*moneyReturn;//floor():向下取整return result;}}
import java.util.Scanner;public class Test {static double total=0.0;public static void main(String[] args) {Scanner cin=new Scanner(System.in);System.out.println("请输入优惠方案:");String str=cin.next();CashContext cc=null;switch(str) {case "正常收费":cc=new CashContext(new CashNormal());break;case "满300返100":cc=new CashContext(new CashRetrun(300,100));break;case "打8折":cc=new CashContext(new CashRebate(0.8));break;}System.out.println("请输入消费金额:");double price=cin.nextInt();total=cc.getResult(price);System.out.println("最后共消费:"+total);cin.close();}}

策略模式的特点

  • 功能:具体算法从具体业务处理中独立
  • 多个if-else出现考虑使用策略模式
  • 策略算法是形同行为的不同实现(多态)
  • 客户端选择,上下文来具体实现策略算法


使用场景

同一个算法,有很多不同的实现情况。

一个定义了很多行为的类,通过多个if-else语句来选择这些行为的情况

优缺点

优点:

  • 避免让客户端涉及到重要算法和数据
  • 避免使用难以维护的多重条件选择语句
  • 易扩展

缺点:

  • 判断逻辑在客户端,需求改变时,要更改客户端的程序。
  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。
  • 增加了对象的数目
  • 只适合扁平的算法结构


策略模式和工厂模式的结合

把分支判断从客户端移动到到环境CashContext类中,此时CashContext相当于一个工厂,选择实例化不同的具体策略类

public class CashContext {private CashStrategy cs=null;//简单工厂:将实例化具体策略从客户端放入Context类中public CashContext(String type) {switch(type) {case "正常收费":CashNormal cs0=new CashNormal();cs=cs0;break;case "满300返100":CashRetrun cr1=new CashRetrun(300,100);cs=cr1;break;case "打8折":CashRebate cr2=new CashRebate(0.8);cs=cr2;break;}}public double getResult(double money) {return cs.acceptCash(money);}}
import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner cin=new Scanner(System.in);System.out.println("请输入优惠方案:");String str=cin.next();CashContext cc=new CashContext(str);System.out.println("请输入消费金额:");double price=cin.nextInt();double total=cc.getResult(price);System.out.println("最终消费:"+total);cin.close();}}

http://www.xdnf.cn/news/848233.html

相关文章:

  • JavaScript(JS)的indexOf和lastIndexOf函数全解析
  • mydisktest测试软件,MyDiskTest
  • 尤雨溪-基本介绍
  • 你想要的系列:网络请求框架OkHttp3全解系列 - (一)OkHttp的基本使用
  • Ubuntu操作系统
  • 三十分钟学会SCALA
  • http状态码301和302详解及区别
  • 量化交易是什么?
  • 《MFC 学习笔记》 1 —— 窗口
  • 史上最详细sqlmap入门教程
  • 【Git】git常用命令大全(初学者必看!!最强详解!!)
  • CSRF攻击原理介绍和利用
  • Simulink 环境基础知识(九)--指定模块属性
  • 获取传感器温度-cpu 温度篇
  • yml 简介(springboot 必备基础,小白入门)
  • Android View 的scroll相关方法属性 以及Scroller弹性滑动原理
  • SVM通俗详解
  • 一文教你搞懂python函数装饰器(wrapper)
  • VPC是什么,VPC详解
  • AST入门与反混淆初体验
  • 史上最全Fragment介绍,包括fragment的定义,生命周期,用法
  • 详解nc命令
  • 各种GAN原理总结及对比
  • Linux命令(11)之chown
  • 别再问别人了,这是小白都能懂的拓扑图指南
  • 「NTFS:让你的硬盘更安全、更高效!」NTFS文件系统详解,
  • iperf3主页官方信息
  • 快速排序的三种方式以及快排的优化
  • CTF-密码学基础
  • Sonar简介及使用