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

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

输出结果:

总结

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

相关推荐
雨落倾城夏未凉16 分钟前
5.通过拷贝构造函数复制一个对象,假如对象的成员中有个指针类型的变量,如何避免拷贝出来的副本中的该成员之下行同一块内存(等价于默认拷贝构造函数有没有缺点)
c++·后端
雨落倾城夏未凉18 分钟前
4.深拷贝VS浅拷贝
c++·后端
dl74321 分钟前
一文看懂spring配置原理
后端
ERP老兵_冷溪虎山24 分钟前
IDEA 幽灵触手实锤!Python 文件一开,Anaconda 全局库让 JDK 编译慢 2-4 秒(附截图证据)
后端
阿华的代码王国32 分钟前
【Android】适配器与外部事件的交互
android·xml·java·前端·后端·交互
写bug写bug33 分钟前
分布式锁的使用场景和常见实现(下)
分布式·后端·面试
Postkarte不想说话33 分钟前
Debian13编译安装FreeSWITCH
后端
SimonKing37 分钟前
Mybatis批量插入,形式不同性能也不同
数据库·后端·程序员
MacroZheng42 分钟前
还在用WebSocket实现即时通讯?试试MQTT吧,真香!
java·spring boot·后端
midsummer_woo1 小时前
基于springboot的IT技术交流和分享平台的设计与实现(源码+论文)
java·spring boot·后端