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

最近阅读《大话数据结构》,学习了策略模式和简单工厂模式,写了一个练习的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);  
    }  
}

输出结果:

总结

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

相关推荐
IT_陈寒4 小时前
React 18并发渲染实战:5个核心API让你的应用性能飙升50%
前端·人工智能·后端
一 乐4 小时前
购物|明星周边商城|基于springboot的明星周边商城系统设计与实现(源码+数据库+文档)
java·数据库·spring boot·后端·spring
y1y1z4 小时前
Spring框架教程
java·后端·spring
V***u4534 小时前
【学术会议论文投稿】Spring Boot实战:零基础打造你的Web应用新纪元
前端·spring boot·后端
喵叔哟4 小时前
6.配置管理详解
后端·python·flask
yuuki2332334 小时前
【C++】类和对象(上)
c++·后端·算法
韩数4 小时前
小白也能看懂! 今年爆火的 MCP 协议究竟是什么?写给普通人的 MCP 指南
后端·aigc·mcp
l***46685 小时前
SSM与Springboot是什么关系? -----区别与联系
java·spring boot·后端
周杰伦_Jay5 小时前
【Go 语言主流 Web】 框架详细解析
开发语言·后端·微服务·架构·golang
风的归宿555 小时前
openresty容器导出火焰图
后端