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

设计模式-策略模式

时间:2023-10-27 15:57:43浏览次数:36  
标签:策略 模式 amount uid new 设计模式 public String

参考:https://blog.51cto.com/u_16125162/6329805

定义:

策略模式(StrategyPattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。是一种对象行为型模式。

  • 打个比方说,我们出门的时候会选择不同的出行方式,比如骑自行车、坐公交、坐火车、坐飞机、坐火箭等等,这些出行方式,每一种都是一个策略。
  • 再打个比方,我们购物下单需要支付时,你可以选择支付宝支付,微信支付,银联支付,每一种支付方式也是一种策略

模式结构

  1. 环境角色(Context):持有一个策略类的引用,提供给客户端使用。

  2. 抽象策略角色(Strategy):这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

  3. 具体策略角色(ConcreteStrategy):包装了相关的算法或行为

案例

  • 抽象策略模式(Strategy)
public interface Payment {
    String pay(String uid, double amount);
}
  • 具体策略模式(ConcreteStrategy)
/**
 * 支付宝pay
 */
public class AliPay implements Payment {

    public String pay(String uid,double amount) {
        System.out.println("欢迎使用支付宝");
        System.out.println("查询账户余额,开始扣款");
        return "支付成功,扣款:"+ amount;
    }
}
/**
 * 微信支付
 */
public class WeChatPay implements Payment {

    public String pay(String uid,double amount) {
        System.out.println("欢迎使用银联卡");
        System.out.println("查询账户余额,开始扣款");
        return "支付成功,扣款:"+ amount;
    }
}
/**
 * 银联支付
 */
public class UnionPay implements Payment {

    public String pay(String uid,double amount) {
        System.out.println("欢迎使用银联卡");
        System.out.println("查询账户余额,开始扣款");
        return "支付成功,扣款:"+ amount;
    }
}
  • 环境角色(context)
public class PayContext {
    private Payment payment;

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

    public String pay(String uid, double amount){
        return payment.pay(uid,amount);
    }
}
  • 测试类
/**
 * 订单类
 */
@Data
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 class PayStrategyTest {
    public static void main(String[] args) throws Exception{
        //下单
        Order order = new Order("1","20200311",100);
        PayContext payContext = null;
        //开始支付,选择支付方式:支付宝 ALI_PAY、银联卡 UNION_PAY、微信支付 WECHAT_PAY
        //每个渠道它的支付的具体算法不一样
        String payType = "WECHAT_PAY";
        if("ALI_PAY".equals(payType)){
            payContext = new PayContext(new AliPay());
        } else if("WECHAT_PAY".equals(payType)){
            payContext = new PayContext(new WeChatPay());
        } else if("UNION_PAY".equals(payType)){
            payContext = new PayContext(new UnionPay());
        } else {
            throw new Exception("支付异常");
        }
        System.out.println(payContext.pay(order.getUid(),order.getAmount()));
    }
}

优缺点

优点

  1. 策略模式提供了对“开闭原则”的完美支持,用户可以在不 修改原有系统的基础上选择算法或行为,也可以灵活地增加 新的算法或行为。
  2. 策略模式提供了管理相关的算法族的办法。
  3. 策略模式提供了可以替换继承关系的办法。
  4. 使用策略模式可以避免使用多重条件转移语句。

缺点

  1. 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
  2. 策略模式将造成产生很多策略类,可以通过使用享元模式在一 定程度上减少对象的数量。

标签:策略,模式,amount,uid,new,设计模式,public,String
From: https://www.cnblogs.com/hasome/p/17792524.html

相关文章

  • 单例模式-双重校验锁
    参考;https://blog.csdn.net/weixin_44471490/article/details/108929289双重校验锁饿汉模式是不需要加锁来保证单例的,而懒汉模式虽然节省了内存,但是却需要使用锁来保证单例,因此,双重校验锁就是懒汉模式的升级版本。普通懒汉式publicclassSingleton{ privatestatic......
  • Java实战:大文件分片上传与断点续传策略及其实际应用
    在许多应用场景中,处理大型文件上传可能成为开发人员面临的一项挑战。在网络环境不稳定,或者文件体积过大的情况下,传统的文件上传方式可能会出现问题。这时,文件分片上传和断点续传技术就显得至关重要。本文将向您展示如何使用Java实现这两种技术,并探讨其主要应用场景。文件分片上传是......
  • 小端模式和大端模式——踩坑记录
    大端小端1前言在做项目时,需要将报文发送给硬件端,报文打包我都是用的大端写入Bytebuf(使用的netty),老大审查代码时,说我写错了,说硬件那边要求是小端传输。不过改成小端写入也容易,重要的是牢记这个知识点。于是趁这个机会复习一下大端和小端。2概念大端(Big-Endian)和小端(Litt......
  • uniapp的easycom模式
    uniapp的easycom模式,无需import和注册components,即可在页面使用固定目录下的组件。这个目的是简化引用,其实还挺坑的。1.直接使用组件,全局又搜索不到引用,第一感觉让人摸不着头脑2.不引用组件,文件下放了多个组件,不知道到底使用了哪个3.进行组件优化,要删除或提取某些组件的时......
  • Linux中的调度策略及其原理
    对于操作系统来讲,它面对的CPU的数量是有限的,干活儿都是它们,但是进程数目远远超过CPU的数目,因而就需要进行进程的调度,有效地分配CPU的时间,既要保证进程的最快响应,也要保证进程之间的公平。这也是一个非常复杂的、需要平衡的事情。在Linux里面,进程大概可以分成两种。一种称为......
  • 【编程开发指南】「设计模式系列」一起来学编程界的“兵法”设计模式(序章)
    设计模式是什么设计模式是一种被广泛应用于软件开发中的技术,它可以帮助开发人员更好地组织和管理代码,提高代码的可读性和可维护性。本文将介绍设计模式的概念、分类和应用场景。设计模式的概念设计模式是一种被反复使用的代码设计经验,它可以解决特定问题的通用解决方案。设计模式不......
  • 软件设计之抽象工厂模式
    类图代码packagetest;importjava.util.Scanner;publicclasstest3{publicstaticvoidmain(String[]args){Factorysfactory=null;ProductAproductA=null;ProductBproductB=null;System.out.println("请输入你想要的......
  • 设计模式—创建型模式之单例模式
    设计模式—创建型模式之单例模式介绍单例模式说明:一个单一的类,负责创建自己的对象,同时确保系统中只有单个对象被创建。单例模式特点:某个类只能有一个实例;(构造器私有)它必须自行创建这个实例;(自己编写实例化逻辑)它必须自行向整个系统提供这个实例;(对外提供实例化方法)单例模式......
  • pageofficeV6强制留痕模式编辑
    转载:强制留痕模式编辑强制留痕模式编辑注意本文中展示的代码均为关键代码,复制粘贴到您的项目中,按照实际的情况,例如文档路径,用户名等做适当修改即可使用。Word中的“痕迹”功能可以跟踪文档中所做的更改。痕迹可以包括添加、删除、移动和格式更改等。Word提供了“痕迹保留”功......
  • Nacos单机模式配置远程数据源、配置身份认证
    1.nacos介绍官网链接:https://nacos.io/zh-cn/docs/what-is-nacos.htmlGithub:https://github.com/alibaba/nacos/Nacos/nɑ:kəʊs/是DynamicNamingandConfigurationService的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos致力于......