首页 > 其他分享 >策略模式

策略模式

时间:2023-12-15 16:44:18浏览次数:32  
标签:策略 double CashContext 模式 designMode money new public

策略模式有两个主要角色,一个是主类,一个是策略类,通过主类的构造函数将策略类注入到主类,从而实现调用不同的策略。

典型的例子就是收银策略,正常收费,八折、五折,满200减50等等。

示例代码

package designMode.strategy;

public class CashContext {
private CashSuper cashSuper;

public CashContext(CashSuper cashSuper) {
this.cashSuper = cashSuper;
}

public double getResult(double money){
return cashSuper.acceptCash(money);
}
}

 

package designMode.strategy;

public abstract class CashSuper {
public abstract double acceptCash(double money);
}

 

package designMode.strategy;

public class CashNormal extends CashSuper {
@Override
public double acceptCash(double money) {
return money;
}
}

 

package designMode.strategy;

public class CashRebate extends CashSuper {
private double moneyRebate = 0.8;

public CashRebate(double moneyRebate) {
this.moneyRebate = moneyRebate;
}

@Override
public double acceptCash(double money) {
return money*moneyRebate;
}
}

 

package designMode.strategy;

public class CashReturn extends CashSuper {
private double moneyConditation = 0.0;
private double moneyReturn = 0.0d;

public CashReturn(double moneyConditation, double moneyReturn) {
this.moneyConditation = moneyConditation;
this.moneyReturn = moneyReturn;
}

@Override
public double acceptCash(double money) {
double result = money;
if(money>moneyConditation){
result = money-Math.floor(money/moneyConditation)*moneyReturn;
}
return result;
}
}

 

package designMode.strategy;

import java.util.Scanner;

public class Client {
public static void main(String[] args) {
CashContext cashContext = null;
Scanner scanner = new Scanner(System.in);
System.out.println("请输入打折方式(1/2/3):");
int in = scanner.nextInt();
String type = "";
switch (in){
case 1:
cashContext = new CashContext(new CashNormal());
type += "正常收费";
break;
case 2:
cashContext = new CashContext(new CashReturn(300,100));
type +="满300返100";
break;
case 3:
cashContext = new CashContext(new CashRebate(0.8));
type += "打八折";
break;
default:
System.out.println("请输入1/2/3");
break;
}
double totalPrices = 0;
System.out.print("请输入单价:");
double price = scanner.nextDouble();
System.out.println("请输入数量:");
double num = scanner.nextDouble();
totalPrices = cashContext.getResult(price * num);
System.out.println("单价:" + price + ",数量:" + num + ",类型:" + type + ",合计:" + totalPrices);
scanner.close();
}
}

标签:策略,double,CashContext,模式,designMode,money,new,public
From: https://www.cnblogs.com/seeksimple/p/17903670.html

相关文章

  • 知识|基于混合模式的多余度飞控全数字仿真系统研究
    *余度(Redundancy):一种确保安全的设计手段,使得出现两个及以上故障时,才会引起既定不希望发生的工作状态。飞行控制软件主要完成飞行传感器数据处理、飞行姿态控制和余度管理任务,对保证飞机安全性和可靠性起着关键作用,但是现实中与飞行控制软件相关的研发测试过程依旧举步维艰。其主......
  • python 脚本的启动模式(python -m以模块方式启动)
    今天再看python的项目时,发现GitHub中给出的python脚本的执行格式是python-mpipinstallsomepackage。于是开始了python模式启动之旅。其中很多相关借鉴了该博客,同时感谢博主:http://www.cnblogs.com/xueweihan/p/5118222.html什么是python启动模块:通过python启动一个库中......
  • 适配器模式揭秘:让不兼容的组件完美协同
    前言从这篇文章开始来盘一盘结构型设计模式,在开始之前先来简单回顾一下创建型的设计模式有哪些,如果有兴趣,就来一起学习吧:设计模式之简单工厂模式工厂方法模式:改变你对软件开发的认知_凡夫编程的技术博客_51CTO博客抽象工厂模式:角色解析与应用探索_凡夫编程的技术博客_51CTO博客设计......
  • Linux防火墙端口设置策略
    #当我们在服务器上部署好我们的环境后,一定要检查一下防火墙的端口策略;否则客户端无法连接。#查看防火墙状态systemctlstatusfirewalld#查看防火墙设已开放的端口#临时端口(默认为空)firewall-cmd--list-ports#永久开放端口(默认为空)firewall-cmd--list-ports--per......
  • SaaS模式相比传统CRM系统有哪些优势?为什么成为行业主流
     在数字化时代,选择适合企业的客户关系管理系统(CRM)至关重要。传统CRM系统曾是企业的重要选择,但随着基于互联网的SaaS模式的兴起,越来越多的企业开始转向SaaSCRM。本文将对比传统CRM系统和SaaSCRM,并解答一些常见问题。一、传统CRM系统的局限性传统CRM系统通常需要企业购买和维......
  • 小谈设计模式(21)—迭代器模式
    (小谈设计模式(21)—迭代器模式)专栏介绍主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。迭代器模式迭代器模式是一种行为型设计模式,它提供了一种访问聚合对象中各个元素的方法......
  • P8818 [CSP-S 2022] 策略游戏 题解
    P8818[CSP-S2022]策略游戏题解题目链接P8818[CSP-S2022]策略游戏简化题意小\(A\)先在\(a[l1,r1]\)中选择一个数\(x\),小\(B\)再在\(b[l2,r2]\)中选择一个数\(y\),最后的分数就是\(x\timesy\)。小\(A\)想让分数尽可能地大,而小\(B\)则想让分数尽可能地小......
  • 写写我认知中的设计模式
    创建型我印象最深刻的就是单例模式,我记得他有一个特别经典的案例:任务管理器;而且我对这个模式的印象也比较深刻:将创建方法私有化,意味着不可以再次创建对象,仅对对象的调用。最近有所感悟的是生成器模式,其实上次软考的学习中我唯一不理解的就是生成器模式,当时听zst2003老师讲,一头雾......
  • 策略模式
    定义策略//校验方法&规则配置varstrategies={isNonEmpty:function(value,errorMsg){//不为空if(value===''){returnerrorMsg;}},minLength:function(value,length,errorMsg){//限制最小长度if(value.lengt......
  • Redis策略
    1.删除策略1.1.立即删除(过期后立即删除)原理:key过期之后立即删除缺点:对CPU不友好,用处理器性能换取存储空间(拿时间换空间),存在大量key同时过期占用大量CPU资源进行删除操作的情况1.2.惰性删除原理:过期后先不删除,等下一次访问时判断是否过期,若过期则立即删除缺点:对CPU不友好,用......