首页 > 其他分享 >设计模式-策略模式

设计模式-策略模式

时间:2024-06-18 17:44:34浏览次数:18  
标签:return String MsgResult 模式 strategy uid 设计模式 public 策略

策略模式

策略模式,又叫政策模式,它是将定义的算法家族分别封装起来,让他们之间可以互相替换,从而让算法的变化不会影响到使用算法的用户,属于行为型模式。

角色:
  • 上下文角色(Context):用来操作策略的上下文环境,屏蔽高层模块对策略,算法的直接访问,封装可能存在的变化。
  • 抽象策略角色(Strategy):规定策略或算法的行为。
  • 具体策略角色(ConcreteStrategy):具体的策略或算法实现。
举例:购物时的支付方式

接口返回封装:

package com.jdwa.strategy;

public class MsgResult {
    private int code;
    private Object data;
    private String msg;

    public MsgResult(int code, Object data, String msg) {
        this.code = code;
        this.data = data;
        this.msg = msg;
    }

    @Override
    public String toString() {
        return "MsgResult{" +
                "code=" + code +
                ", data=" + data +
                ", msg='" + msg + '\'' +
                '}';
    }
}

抽象策略角色:支付方式抽象

package com.jdwa.strategy;

public abstract class Payment {

    public abstract String getName();

    public MsgResult pay(String uid,double amount){
        if (queryBalance(uid) < amount) {
            return new MsgResult(500,"支付失败","余额不足");
        }
        return new MsgResult(200,"支付成功","支付金额"+amount);
    }

    protected abstract double queryBalance(String uid);
}

具体策略角色:支付宝

package com.jdwa.strategy;

public class AliPay extends Payment{
    @Override
    public String getName() {
        return "支付宝";
    }

    @Override
    protected double queryBalance(String uid) {
        return 900;
    }
}

具体策略角色:微信

package com.jdwa.strategy;

public class WechatPay extends Payment{
    @Override
    public String getName() {
        return "微信";
    }

    @Override
    protected double queryBalance(String uid) {
        return 500;
    }
}

上下文:支付策略管理

package com.jdwa.strategy;

import java.util.HashMap;
import java.util.Map;

public class PayStrategy {
    public static final String ALI_PAY = "AliPay";
    public static final String WECHAT_PAY = "Wechat_pay";
    public static final String DEFAULT_PAY = ALI_PAY;
    
    private static Map<String,Payment> strategy = new HashMap<>();
    
    static {
        strategy.put(ALI_PAY,new AliPay());
        strategy.put(WECHAT_PAY,new WechatPay());
    }
    
    public static Payment get(String paykey){
        if (!strategy.containsKey(paykey)){
            return strategy.get(DEFAULT_PAY);
        }
        return strategy.get(paykey);
    }
}

上层模块:订单

package com.jdwa.strategy;

public class Order {
    private String uid;
    private String orderId;
    private double amount;

    public Order(String uid, String orderId, double amount) {
        this.uid = uid;
        this.orderId = orderId;
        this.amount = amount;
    }
    
    public MsgResult pay(){
        return pay(PayStrategy.DEFAULT_PAY);
    }
    
    public MsgResult pay(String paykey){
        Payment payment = PayStrategy.get(paykey);
        System.out.println("欢迎使用"+payment.getName());
        System.out.println("本次交易金额为"+amount+",开始扣款");
        return payment.pay(uid,amount);
    }
}


测试:

package com.jdwa.strategy;

public class Client {
    public static void main(String[] args) {
        Order order = new Order("1","4532787832456845434",800);
        System.out.println(order.pay());
        System.out.println("=============分割线================");
        System.out.println(order.pay(PayStrategy.WECHAT_PAY));
    }

}

结果:

欢迎使用支付宝
本次交易金额为800.0,开始扣款
MsgResult{code=200, data=支付成功, msg='支付金额800.0'}
=============分割线================
欢迎使用微信
本次交易金额为800.0,开始扣款
MsgResult{code=500, data=支付失败, msg='余额不足'}
欢迎大家留言,以便于后面的人更快解决问题!另外亦欢迎大家可以关注我的微信公众号,方便利用零碎时间互相交流。共勉!

标签:return,String,MsgResult,模式,strategy,uid,设计模式,public,策略
From: https://www.cnblogs.com/caozz/p/18254802/strategy

相关文章

  • Golang与设计模式
    单例模式因为之前研究Java比较多,所以当我试着使用go来实现一些设计模式的时候,首先想到的就是照搬Java中的思路,后面对go了解加深之后又增加了一些新的思路。在Java中实现的单例模式的思路有很多,但是比较好的两个思路是利用类加载机制生成单例对象,check-lock-check机制避免并发问......
  • Ps:条件模式更改
    Ps菜单:文件/自动/条件模式更改Automate/ConditionalModeChange条件模式更改 ConditionalModeChange脚本命令可用于将图像文档的颜色模式更改为指定的模式。既可以将指定的源颜色模式转换为目标颜色模式,还可以将此命令记录在动作中以便实施快速转换。◆  ◆  ◆......
  • 太空策略单机游戏推荐:群星Stellaris 游戏支持win和mac下载
    《群星Stellaris》是一款由ParadoxInteractive开发和发行的大型策略游戏。游戏设定在一个宏大的宇宙中,玩家将扮演一个正在发展的宇宙帝国的领导者,必须面对各种来自宇宙星系的挑战。游戏的核心玩法包括探索宇宙、殖民新星球、发展科技、建立外交关系、与其他文明交战等。玩家......
  • ARMv7 寄存器 工作模式 和指令集 和 堆栈回溯
    因此,在图4-1中,如果处理器是在IRQ模式,我们可以看见R0,R1...R12(与在用户模式看到的相同的寄存器),加上SP_IRQ和LR_IRQ(仅在IRQ模式中可以访问的寄存器)和R15(程序计数器,PC)。我们通常不必指定模式中的寄存器名。如果我们在一行代码中引用R13,处理器会访问当前模式对应的SP寄存器。......
  • 数据库修复:重要步骤和策略
    mysql 数据库修复ibdmysql数据库表修复在数据库管理中,数据安全性和完整性是至关重要的。然而,由于各种原因,数据库可能会遭受损害,导致数据丢失或无法访问。在这些情况下,数据库修复成为一项关键任务。本文将重点介绍mysql数据库修复ibdmysql数据库表修复的相关内容。一、什么......
  • 持续总结中!2024年面试必问 20 道设计模式面试题(二)
    上一篇地址:持续总结中!2024年面试必问20道设计模式面试题(一)-CSDN博客三、请描述单例模式(SingletonPattern)及其使用场景。单例模式是一种创建型设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。这种模式在软件系统中非常常见,因为它提供了一种控制实......
  • MVVM模式开发WinForm-ReactiveUI
    一、引言  谈到MVVM设计模式,首先让人想到的是WPF。没错,MVVM的概念是微软在2005年提出的,并首次将其应用到WPF中。最近非常火的Vue.js也是使用了MVVM的设计模式。MVVM设计模式的核心部分是DataBinding机制。顾名思义,其功能就是将Model的数据绑定到View层,并且将View层控件的变换绑......
  • 助力知识博主,实现在家搞副业的FlowUs新策略
    助力知识博主,实现在家副业的FlowUs新策略我们设定了一个雄心勃勃的目标:帮助100位知识博主在FlowUs上实现副业成功。这个目标不仅得到了团队成员的广泛支持,甚至有人认为它过于保守,因为FlowUs的多功能性使其成为自媒体博主收入增长的理想工具。01.多模态内容创作的无限可能Fl......
  • 【论文复现|智能算法改进】基于多策略的改进蜜獾算法及其应用
    目录1.算法原理2.改进点3.结果展示4.参考文献5.代码获取1.算法原理【智能算法】蜜獾算法(HBA)原理及实现2.改进点限制反向学习机制在挖掘模式和蜂蜜模式不同路径更新的基础上引入限制反向学习机制,在算法迭代时,对当前的种群个体进行限制反向学习,生成新的限制反向解......
  • 微信小程序的“数据猎场”:玩转数据请求与缓存策略的秘籍
    微信小程序的“数据猎场”:玩转数据请求与缓存策略的秘籍数据请求:远程探宝的艺术基础篇:wx.request,你的第一把钥匙示例一:简单数据请求进阶篇:安全与性能的双重保障示例二:HTTPS与超时设置高级篇:请求头与身份验证示例三:携带令牌的高级探险缓存策略:本地藏宝图的秘密理解缓......