策略模式
策略模式(
Strategy Pattern
)属于对象的⾏为模式。其⽤意是针对⼀组算 法,将每⼀个算法封装到具有共同接⼝的独⽴的类中,从⽽使得它们可以 相互替换。策略模式使得算法可以在不影响到客户端的情况下发⽣变化。 其主要⽬的是通过定义相似的算法,替换 if else
语句写法,并且可以随时 相互替换。
策略模式有什么好处?
定义了⼀系列封装了算法、⾏为的对象,他们可以相互替换。
举例:
Java.util.List
就是定义了⼀个增(
add
)、删(
remove
)、改 ( set
)、查(
indexOf
)策略,⾄于实现这个策略的 ArrayList 、
LinkedList
等类,只是在具体实现时采⽤了不同的算法。但因 为它们策略⼀样,不考虑速度的情况下,使⽤时完全可以互相替换使⽤。
代码:
1, 策略接口
public interface Strategy {
PayInfo payForSometh();
}
2 支付类的实体类
public class PayInfo {
String payType;
String payCode;
String payDesc;
public PayInfo(String payType, String payCode, String payDesc) {
super();
this.payType = payType;
this.payCode = payCode;
this.payDesc = payDesc;
}
public String getPayType() {
return payType;
}
public void setPayType(String payType) {
this.payType = payType;
}
public String getPayCode() {
return payCode;
}
public void setPayCode(String payCode) {
this.payCode = payCode;
}
public String getPayDesc() {
return payDesc;
}
public void setPayDesc(String payDesc) {
this.payDesc = payDesc;
}
}
3 微信支付策略
public class WxPay implements Strategy {
@Override
public PayInfo payForSometh() {
System.out.println("通过微信支付");
PayInfo pin = new PayInfo("微信", "1", "支付成功");
return pin;
}
}
4 支付宝策略
public class ZfbPay implements Strategy {
public PayInfo payForSometh() {
System.out.println("调用支付宝支付功能,根据返回值进行PayInfo类信息的设置");
PayInfo zhifubaoPayInfo= new PayInfo("支付宝", "0", "支付成功");
return zhifubaoPayInfo;
}
}
5. 测试类
public class TMain {
public static void main(String[] args) {
Strategy strategy = new WxPay();
Strategy strategy2 = new ZfbPay();
PayInfo payinfo = strategy2.payForSometh();
PayInfo payInfo = strategy.payForSometh();
System.out.println(payinfo.getPayType() + "," + payinfo.getPayCode() + "," + payinfo.getPayDesc());
System.out.println(payInfo.getPayType() + "," + payInfo.getPayCode() + "," + payInfo.getPayDesc());
}
}
6 结果
注意: 如果实际spring中应用策略,是要用bean的引入的。
这篇优化文章中有例子代码:
一次代码优化经验的分享_6个日的梦想的博客-CSDN博客
总结
- 在我的理解中策略模式的核心就是面向接口编程。把每个具体的算法封装成一个类,使用继承方便封装公共需求,减少了算法间的耦合。
- 使用context上下文对象,减轻了客户端的职责。由context来去判断使用哪种算法。当然这一部分你可以使用反射,使用了反射的话那么switch语句都省了。
优点 1.解耦,避免使用多重条件判断。 2.可扩展新好 缺点 1.类会增多 2.所有策略类都需要对外暴露