> 文章列表 > Java设计模式-9 、策略模式

Java设计模式-9 、策略模式

Java设计模式-9 、策略模式

策略模式

策略模式(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 {@Overridepublic 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博客

总结

  1. 在我的理解中策略模式的核心就是面向接口编程。把每个具体的算法封装成一个类,使用继承方便封装公共需求,减少了算法间的耦合。
  2. 使用context上下文对象,减轻了客户端的职责。由context来去判断使用哪种算法。当然这一部分你可以使用反射,使用了反射的话那么switch语句都省了。
优点
1.解耦,避免使用多重条件判断。
2.可扩展新好缺点
1.类会增多
2.所有策略类都需要对外暴露