源码学习之设计模式(策略模式)

今天要给大家说的是策略模式。先不做解释,先看代码,体会一下策略模式的神奇。

修改前的代码

public class Main {
    public static void main(String[] args) {
        String payType = "wxPay";
           if(payType.equals("alipay")){
               System.out.println("支付包支付");
           }else if(payType.equals("credit")){
               System.out.println("银联支付");
           }else if(payType.equals("netPay")){
               System.out.println("网银支付");
           }else if(payType.equals("creditCard")){
               System.out.println("信用卡支付");
           }else{
               System.out.println("现金支付");
           }
    }
}

大家日常开发中一定见过类似上面的场景吧,写了那么多if-else或者用switch-case,看着都让人头晕。现在让我们给他来个大变身吧。数码宝贝究极进化。

修改后的代码

首先定义一个支付策略接口,所有的支付方法都应实现此接口。

public interface PayStrategy {
    void doPay();
}

不同的支付方式的类实现上述接口,各个类结构为

public class AliPay implements PayStrategy {
    @Override
    public void doPay() {
        System.out.println("支付宝支付");
    }
}

public class CreditCardPay implements PayStrategy {
    @Override
    public void doPay() {
        System.out.println("信用卡支付");
    }
}

public class CreditPay implements PayStrategy {
    @Override
    public void doPay() {
        System.out.println("银联支付");
    }
}

public class MoneyPay implements PayStrategy {
    @Override
    public void doPay() {
        System.out.println("现金支付");
    }
}

public class NetPay implements PayStrategy {
    @Override
    public void doPay() {
        System.out.println("网银支付");
    }
}

public class WxPay implements PayStrategy {
    @Override
    public void doPay() {
        System.out.println("微信支付");
    }
}

在定义一个类管理策略,作为上下文。

public class PayContext {
    private PayStrategy payStrategy;

    public PayContext(PayStrategy payStrategy){
        this.payStrategy = payStrategy;
    }
    public void executePay (){
        payStrategy.doPay();
    }
}

此处呢,可以根据需要使用单例模式去定义这个类,保证全局的唯一性。

测试结果如下:

总结

。策略模式的优点很明显,可维护性和可读性更好,方便以后扩展;然而缺点一眼就能看出:需要定义的类增多,对于对象的管理难度加大等。

类似上面的场景有很多,要根据实际情况选择使用,并不一定非得要用策略模式,对于后期改动比较小的,选择if-else或者switch-case显然 是最优的方案

说明

本文章为作者读书笔记及感悟,其中参考了《spring5核心原理与30个类手写实战》以及互联网上的内容。如有错误,请评论或者私聊我,欢迎探讨技术问题 。即将毕业,在准备找工作,有朋友想给我介绍的,欢迎添加微信:sllbiao。

原文地址:https://www.cnblogs.com/sllbwcoding/p/12072150.html

时间: 2024-11-09 22:39:31

源码学习之设计模式(策略模式)的相关文章

spring源码学习之设计模式(1)单例模式

众所周知,单例模式分为饿汉式和懒汉式,昨天在看了<spring5核心原理与30个类手写实战>之后才知道饿汉式有很多种写法,分别适用于不同场景,避免反射,线程不安全问题.下面就各种场景.采用的方式及其优缺点介绍. 饿汉式 (绝对的线程安全) 代码示例 1.第一种写法 ( 定义即初始化) public class Singleton{ private static final Singleton instance = new Singleton(); private Singleton() {}

ZooKeeper源码学习笔记(3)--Cluster模式下的ZooKeeper

Cluster集群模式 前一篇文章 介绍了当配置文件中只有一个server地址时,Standalone模式的启动流程以及ZooKeeper的节点模型和运行逻辑.在本节中,我会针对Cluster的运行模式进行详细讲解. 启动流程 public synchronized void start() { loadDataBase(); cnxnFactory.start(); startLeaderElection(); super.start(); } QuorumPeerMain::runFromC

JDK 源码 阅读 - 2 - 设计模式 - 创建型模式

A.创建型模式 抽象工厂(Abstract Factory) javax.xml.parsers.DocumentBuilderFactory DocumentBuilderFactory通过FactoryFinder实例化具体的Factory. 使用例子: DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docBuilder

访何红辉:谈谈Android源码中的设计模式

最近Android 6.0版本的源代码开放下载,刚好分析Android源码的技术书籍<Android源码设计模式解析与实战>上市,我们邀请到它的作者何红辉,来谈谈Android源码中的设计模式,以及近期Android开发中的一些热点话题. 受访嘉宾介绍: 何红辉(@MrSimp1e),前友盟Android工程师,活跃于国内各大技术社区,热爱开源,热爱技术,热爱分享.Android开源库 AndroidEventBus . Colorful 作者, 开发技术前线 站长,<Android源码

Android 源码中的设计模式

最近看了一些android的源码,发现设计模式无处不在啊!感觉有点乱,于是决定要把设计模式好好梳理一下,于是有了这篇文章. 面向对象的六大原则 单一职责原则 所谓职责是指类变化的原因.如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责.而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因.通俗的说,即一个类只负责一项职责,将一组相关性很高的函数.数据封装到一个类中. 开闭原则 对于扩展是开放的,这意味着模块的行为是可以扩展的.当应用的需求改变时,我们可以对模块进行扩展,使其

struts2源码学习之初始化(三)

在上一篇struts2源码学习之初始化(二)中已经详细介绍了Dispatcher的初始化工作,只差最后一点,容器的创建.这一篇就仔细介绍容器的创建过程,初始化过程以及容器的作用.还是先从源码入手,上一篇已经分析到了Dispatcher类的init()的这段代码: Container container = init_PreloadConfiguration(); container.inject(this); init_CheckWebLogicWorkaround(container); 接着

FireMonkey 源码学习(5)

(5)UpdateCharRec 该函数的源码分析如下: procedure TTextLayoutNG.UpdateCharRec(const ACanvas: TCanvas; NeedBitmap: Boolean; var NewRec: PCharRec; HasItem: Boolean; const CharDic: TCharDic; const AFont: TFont; const Ch: UCS4Char; const NeedPath: Boolean = False);

jquery源码学习

jQuery 源码学习是对js的能力提升很有帮助的一个方法,废话不说,我们来开始学习啦 我们学习的源码是jquery-2.0.3已经不支持IE6,7,8了,因为可以少学很多hack和兼容的方法. jquery-2.0.3的代码结构如下 首先最外层为一个闭包, 代码执行的最后一句为window.$ = window.jquery = jquery 让闭包中的变量暴露倒全局中. 传参传入window是为了便于压缩 传入undefined是为了undifined被修改,他是window的属性,可以被修

Hadoop源码学习笔记(1) ——第二季开始——找到Main函数及读一读Configure类

Hadoop源码学习笔记(1) ——找到Main函数及读一读Configure类 前面在第一季中,我们简单地研究了下Hadoop是什么,怎么用.在这开源的大牛作品的诱惑下,接下来我们要研究一下它是如何实现的. 提前申明,本人是一直搞.net的,对java略为生疏,所以在学习该作品时,会时不时插入对java的学习,到时也会摆一些上来,包括一下设计模式之类的.欢迎高手指正. 整个学习过程,我们主要通过eclipse来学习,之前已经讲过如何在eclipse中搭建调试环境,这里就不多述了. 在之前源码初