概念
在策略模式中,我们自己定义多个算法,将他们封装成一个个类,实现同一个接口,使他们可以相互替换。可以解决多个算法相似的情况下会有很多的else if存在,扩展性比较好。
策略模式的三个角色:
- 环境(Context):Context是维护一个对策略对象的引用,并在需要时将客户端请求委托给具体的策略对象执行,Context不负责具体的实现,通过调用策略对象的方法来完成对应的操作。
- 抽象策略(Abstract Strategy):定义了策略对象的公共接口或者抽象类,规定了具体策略类必须实现的方法。
- 具体模式(Concrete Strategy):实现了抽象策略定义的接口或者抽象类,包含了具体的算法实现。
场景
现在的每个人都有银行卡,一个人可能拥有一张银行卡,也可能拥有四张五张银行卡甚至更多,那我们支付的时候选择使用哪张银行卡支付呢?
不使用策略模式的是什么样的
下面演示不使用策略模式的情况。
package com.example.springBootMyBatis.designMode.strategy;
/**
* 银行卡类
*
* @author 赵东洋
*/
public class bankCard {
public static void otUsedStrategy(bankCardType type) {
if (bankCardType.GSYH == type) {
System.out.println("这里使用的是工商银行");
} else if (bankCardType.NSYH == type) {
System.out.println("这里使用的是农商银行");
} else if (bankCardType.ZGYH == type) {
System.out.println("这里使用的是中国银行");
} else {
System.out.println("没有该银行");
}
/*
* ................
* 后面如果新增更多的银行卡类型,需要继续添加else if判断,这里只是简单演示一下,
* 如果是实际的业务开发,代码量会非常大,这
*/
}
/**
* 银行卡类型枚举
*/
public enum bankCardType {
/**
* 工商银行
*/
GSYH,
/**
* 农商银行
*/
NSYH,
/**
* 中国银行
*/
ZGYH;
}
}
使用策略模式
创建一个银行卡策略接口
package com.example.springBootMyBatis.designMode.strategy;
/**
* 银行卡策略
* @author 赵东洋
*/
public interface BankCardStrategy {
/**
* 银行卡接口
*/
public String bankCard();
}
其他的银行去实现这个接口
# 工商银行实现
package com.example.springBootMyBatis.designMode.strategy;
/**
* 工商银行 银行策略
* @author 赵东洋
*/
public class GSYHBankCard implements BankCardStrategy {
@Override
public String bankCard() {
return "使用工商银行银行卡";
}
}
# 农商银行实现
package com.example.springBootMyBatis.designMode.strategy;
/**
* 农商银行 银行卡策略
* @author 赵东洋
*/
public class NSYHBankCard implements BankCardStrategy{
@Override
public String bankCard() {
return "使用农商银行银行卡";
}
}
# 中国银行实现
package com.example.springBootMyBatis.designMode.strategy;
/**
* 中国银行 银行卡策略
* @author 赵东洋
*/
public class ZGYHBankCard implements BankCardStrategy{
@Override
public String bankCard() {
return "这里使用中国银行银行卡";
}
}
创建Context
package com.example.springBootMyBatis.designMode.strategy;
/**
* 维护对象策略的引用
*
* @author 赵东洋
*/
public class Context {
private BankCardStrategy bankCardStrategy;
/**
* 构造器
*/
public Context(BankCardStrategy bankCardStrategy) {
this.bankCardStrategy = bankCardStrategy;
}
/**
* 执行策略
*/
public String executeStrategy() {
return bankCardStrategy.bankCard();
}
}
创建测试类,使用Context查看改变Strategy的行为变化。
package com.example.springBootMyBatis.designMode.strategy;
/**
* 测试
*
* @author 赵东洋
*/
public class Test {
public static void main(String[] args) {
/*
* 使用工商银行
*/
Context gs = new Context(new GSYHBankCard());
System.out.println(gs.executeStrategy());
/*
* 使用农商银行
*/
Context ns = new Context(new NSYHBankCard());
System.out.println(ns.executeStrategy());
/*
* 使用中国银行
*/
Context zh = new Context(new NSYHBankCard());
System.out.println(zh.executeStrategy());
}
}
输出结果