最近阅读《大话数据结构》,学习了策略模式和简单工厂模式,写了一个练习的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);
}
}
输出结果:
总结
初学设计模式,目前还处于懵懂状态,此文章作为学习笔记,如有不对的地方,欢迎各位大佬指正。