初学策略模式+简单工厂模式练习

最近阅读《大话数据结构》,学习了策略模式和简单工厂模式,写了一个练习的Demo代码用于复习。

业务需求:

  • 支付场景中有多种支付方式,例如微信支付、支付宝、银行卡等,每一种支付方式就对应着不同的业务代码,也就是不同的策略。如果使用 if 语句来判断使用何种支付方式,全部写在一个类中,代码就会显得臃肿不优雅。

代码设计

  • 首先要定义一个策略的父类Strategy,这个父类不负责具体业务,只定义一个支付方法void pay(Double money)

  • 每一种支付方式子类要继承Strategy父类,并重写pay()方法,实现具体的支付逻辑。

  • 还需要创建一个策略上下文类,此示例中名称为StrategyContext,这个类中的成员变量保存了指向了具体策略的引用。

  • 截至到目前,如果想要使用某个支付场景,需要这样编写代码:new StrategyContext(new Alipay()),而使用简单工厂模式,可以避免在编写代码时手动去new对象。

  • 因此还需要创建一个策略工厂类,这个工厂类中保存着指向StrategyContext的引用,并且提供一个createStrategyContext(PayType payType)方法,根据接收的不同PayType枚举创建不同的StrategyContext对象,这样,new对象的过程就交给了工厂类,我们只需要传递不同的支付方式就好啦

代码示例

支付方式枚举

java 复制代码
public enum PayType {  
    WeChatPay,AliPay,BankPay;  
}

策略父类

java 复制代码
public class Strategy {  
    void pay(Double money) {  
    }  
}

微信支付

java 复制代码
public class WeChatPay extends Strategy{  
    @Override  
    void pay(Double money) {  
        System.out.println("使用微信支付" + money + "元");  
    }  
}

支付宝支付

java 复制代码
public class AliPay extends Strategy{  
    @Override  
    void pay(Double money) {  
        System.out.println("使用支付宝支付" + money + "元");  
    }  
}

银行卡支付

java 复制代码
public class BankPay extends Strategy{  
    @Override  
    void pay(Double money) {  
        System.out.println("使用银行卡支付" + money + "元");  
    }  
}

策略上下文

java 复制代码
public class StrategyContext {  
    private Strategy strategy = null;  

    public StrategyContext(Strategy strategy){  
        this.strategy = strategy;  
    }  
    public void pay(Double money){  
        strategy.pay(money);  
    }  
}

工厂类

java 复制代码
public class StrategyFactory {  
    private StrategyContext strategyContext = null;  

    public StrategyContext createStrategyContext(PayType payType){  
        switch (payType){  
            case AliPay:  
                strategyContext = new StrategyContext(new AliPay());  
                break;  
            case WeChatPay:  
                strategyContext = new StrategyContext(new WeChatPay());  
                break;  
            case BankPay:  
                strategyContext = new StrategyContext(new BankPay());  
                break;  
        }  
        return strategyContext;  
    }  
}

测试代码

java 复制代码
public class Main {  
    public static void main(String[] args) {  
        StrategyFactory strategyFactory = new StrategyFactory();  
        StrategyContext strategyContext = strategyFactory.createStrategyContext(PayType.AliPay);  
        strategyContext.pay(450.0);  
    }  
}

输出结果:

总结

初学设计模式,目前还处于懵懂状态,此文章作为学习笔记,如有不对的地方,欢迎各位大佬指正。

相关推荐
新知图书21 分钟前
Rust编程与项目实战-模块std::thread(之一)
开发语言·后端·rust
盛夏绽放42 分钟前
Node.js 和 Socket.IO 实现实时通信
前端·后端·websocket·node.js
Ares-Wang1 小时前
Asp.net Core Hosted Service(托管服务) Timer (定时任务)
后端·asp.net
Rverdoser2 小时前
RabbitMQ的基本概念和入门
开发语言·后端·ruby
Tech Synapse3 小时前
Java根据前端返回的字段名进行查询数据的方法
java·开发语言·后端
.生产的驴3 小时前
SpringCloud OpenFeign用户转发在请求头中添加用户信息 微服务内部调用
spring boot·后端·spring·spring cloud·微服务·架构
微信-since811923 小时前
[ruby on rails] 安装docker
后端·docker·ruby on rails
代码吐槽菌5 小时前
基于SSM的毕业论文管理系统【附源码】
java·开发语言·数据库·后端·ssm
豌豆花下猫5 小时前
Python 潮流周刊#78:async/await 是糟糕的设计(摘要)
后端·python·ai
YMWM_5 小时前
第一章 Go语言简介
开发语言·后端·golang