目录
1.什么是策略模式
策略模式属于行为设计模式,其主要是将同一行为下的不同算法策略(如支付行为下的现金支付、微信支付、支付宝支付等策略)封装到实现共同接口的独立子类中,从而使得它们可以相互替换。
策略模式使得算法可以在不影响到客户端的情况下发生变化。其主要目的是通过定义相似的算法,替换if else 语句写法,并且可以随时相互替换。
所以,他的优点很明显,就是可以替换掉冗余的if else和switch代码块,同时避免重复的代码。
2.策略模式结构
一般来说,策略模式包括以下三种角色:
- 环境上下文(Context)角色:持有一个Strategy引用,委托策略变量调用具体策略所实现的策略接口中的方法。
- 策略(Strategy)角色:抽象角色,通常由一个接口或抽象类实现,此角色给出所有的具体策略类所需接口。
- 具体策略(ConcreteStrategy)角色:具体实现策略接口的类,包装了相关的算法或行为。
简单来说就是,一个行为接口规定其行为类型性质,然后一些继承该接口的算法类,最后一个策略上下文,在此上下文中根据情况选择策略,并执行。
3.代码示例(支付策略)
下面以支付策略模式为例,编写相关代码:
(1)定义策略(Strategy)角色:Payment
public interface Payment {
void pay(double number);
}
(2)编写相关策略(微信、支付宝):
public class WechatPay implements Payment{
@Override
public void pay(double number) {
System.out.println("这里是微信支付,支付金额:"+number);
}
}
public class ZhifubaoPay implements Payment{
@Override
public void pay(double number) {
System.out.println("这里是支付宝支付,支付金额:"+number);
}
}
(3)创建一个行为随着策略对象改变而改变的 context 对象:
public class PayContext {
private static final Map<String,Payment> payMap = new HashMap<String, Payment>(){{
put("1",new WechatPay());
put("2",new ZhifubaoPay());
}};
/**
* 支付策略选择方法
* @param payFlag 支付策略标识
*/
public void payChoose(String payFlag){
//根据标识,选择对应的策略
Payment payment = payMap.get(payFlag);
//执行策略
payment.pay(20.0);
}
}
注意:此处维护了一个payMap,对支付标识和对应策略进行了映射,以便以后可以进行动态维护。当我们需要添加新的支付策略时,只需要在该map中添加标识和对应的策略类即可。
(4)最后,我们进行测试:
public class Test {
public static void main(String[] args) {
//选择1标识符,进行微信支付
new PayContext().payChoose("1");
//选择2标识符,进行支付宝支付
new PayContext().payChoose("2");
}
}
执行结果:
成功根据传递的标识,调用对应的策略。