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

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

输出结果:

总结

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

相关推荐
码农派大星。4 分钟前
Spring Boot 配置文件
java·spring boot·后端
杜杜的man44 分钟前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang
幼儿园老大*1 小时前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go
llllinuuu1 小时前
Go语言结构体、方法与接口
开发语言·后端·golang
cookies_s_s1 小时前
Golang--协程和管道
开发语言·后端·golang
为什么这亚子1 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
想进大厂的小王1 小时前
项目架构介绍以及Spring cloud、redis、mq 等组件的基本认识
redis·分布式·后端·spring cloud·微服务·架构
customer082 小时前
【开源免费】基于SpringBoot+Vue.JS医院管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·开源·intellij-idea
2402_857589362 小时前
SpringBoot框架:作业管理技术新解
java·spring boot·后端
一只爱打拳的程序猿2 小时前
【Spring】更加简单的将对象存入Spring中并使用
java·后端·spring