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

设计模式-策略模式

策略模式

简介:策略模式定义了一系列算法,并将算法封装起来,使他们可以相互替换,且算法的变化不影响使用算法的客户;把使用算法的责任和算法的实现分割开,并委派给不同的对象对这些算法进行管理
主要角色
  1. 抽象算法类(Strategy) 定义公共接口
  2. 具体策略实现类(ConCrete Strategy) 具体实现类实现具体的算法
  3. 环境类(Context) 持有一个策略类的引用,给客户端调用
    797576-20190828152408634-96886663.png
应用场景:
  1. 电商中的支付方式,随着版本的迭代支持的支付方式可能会越来越多
  2. 消息推送方式等
实现(支付为例)
  1. 抽象算法类
public interface PaymentStrategy {

    public void pay(int amount);

}
  1. 实现类
/******
*    信用卡支付
*
**/
public class CreditCardStrategy implements PaymentStrategy(){
    
    private String name;
    private String cardNumber;
    private String cvv;
    private String dateOfExpiry;

    public CreditCardStrategy(String nm, String ccNum, String cvv, String expiryDate){

        this.name=nm;
        this.cardNumber=ccNum;
        this.cvv=cvv;
        this.dateOfExpiry=expiryDate;
    }

     @Override
    public void pay(int amount) {
        System.out.println(amount +" paid with credit/debit card");
    }
}
/******
*    支付宝支付
*
**/
public class AlipayCardStrategy implements PaymentStrategy(){
    
    private String tel;
    private String password;
 
    public AlipayCardStrategy (String tel, String password ){

        this.tel=tel;
        this.password =password ;
     
    }

     @Override
    public void pay(int amount) {
        System.out.println(amount +" paid with Alipay");
    }
}
  1. 环境类(选择支付方式调用支付)
    public class PayContext(){
        PaymentStrategy paymentStrategy = null;
        //初始化默认支付方式
        public PayContext(PaymentStrategy paymentStrategy ){
            this.paymentStrategy = paymentStrategy ;
        }
        //选择支付方式
         public void setPaymentStrategy (PaymentStrategy paymentStrategy ){
            this.paymentStrategy = paymentStrategy ;
        }
    //支付
     public void pay(int amount ){
            paymentStrategy.pay(amount )
        }    
}
总结

优点:解耦,可读性、扩展性增强
缺点:要了解所有的实现策略方法

转载于:https://www.cnblogs.com/monkay/p/11424538.html

相关文章:

  • CTF 资源
  • hibernate的id生成策略
  • Apache Kafka(七)- Kafka ElasticSearch Comsumer
  • Apache Kafka(八)- Kafka Delivery Semantics for Consumers
  • liquibase 注意事项
  • Red Team远程控制软件
  • upload-labs 上传漏洞靶场环境以及writeup
  • Hive on Tez 中 Map 任务的数量计算
  • countUp.js-数字滚动效果(简单基础使用)
  • Windows 搭建 nginx rtmp服务器
  • MySQL的sql_mode模式说明及设置
  • my read law / notarization / gongzheng
  • 我要成为怎么样的人
  • 虚拟机enp0s8网卡无法联网和开放linux端口
  • ANT下载和配置 IDEA
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • JS 中的深拷贝与浅拷贝
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • ES6系列(二)变量的解构赋值
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • iOS | NSProxy
  • JS学习笔记——闭包
  • k8s如何管理Pod
  • k个最大的数及变种小结
  • Spark RDD学习: aggregate函数
  • Webpack 4 学习01(基础配置)
  • 给github项目添加CI badge
  • 免费小说阅读小程序
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 思维导图—你不知道的JavaScript中卷
  • 提醒我喝水chrome插件开发指南
  • 通过git安装npm私有模块
  • 延迟脚本的方式
  • Java数据解析之JSON
  • Mac 上flink的安装与启动
  • ​ssh免密码登录设置及问题总结
  • # 数据结构
  • (C++)八皇后问题
  • (java)关于Thread的挂起和恢复
  • (编译到47%失败)to be deleted
  • (二)JAVA使用POI操作excel
  • (分布式缓存)Redis持久化
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (十一)c52学习之旅-动态数码管
  • (学习日记)2024.01.09
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转) Face-Resources
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • .htaccess配置重写url引擎
  • .Net Remoting(分离服务程序实现) - Part.3
  • .net开发时的诡异问题,button的onclick事件无效
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • [Android Pro] AndroidX重构和映射
  • [BZOJ1008][HNOI2008]越狱