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

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

输出结果:

总结

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

相关推荐
拾贰_C1 小时前
【SpringBoot】MyBatisPlus(MP | 分页查询操作
java·spring boot·后端·spring·maven·apache·intellij-idea
就叫飞六吧6 小时前
Spring Security 集成指南:避免 CORS 跨域问题
java·后端·spring
冼紫菜8 小时前
[特殊字符]CentOS 7.6 安装 JDK 11(适配国内服务器环境)
java·linux·服务器·后端·centos
秋野酱9 小时前
Spring Boot 项目的计算机专业论文参考文献
java·spring boot·后端
香饽饽~、9 小时前
【第二篇】 初步解析Spring Boot
java·spring boot·后端
你是狒狒吗10 小时前
消息队列了解一哈
后端
Chandler2410 小时前
Go语言 GORM框架 使用指南
开发语言·后端·golang·orm
蚂蚁在飞-11 小时前
Golang基础知识—cond
开发语言·后端·golang
程序员爱钓鱼17 小时前
匿名函数与闭包(Anonymous Functions and Closures)-《Go语言实战指南》原创
后端·golang