strategy模式简述与使用
-
java设计模式概述:
为了提高代码的可读性,可扩展性以及代码的复用性,为了解决在写代码过程中遇到的代码设计问题,全世界开发人员集众智总结出许多优秀的代码设计模式。java的设计模式众多,有23种,大致可以分为三类:
1.创造型模式
有工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。初级阶段需要掌握最重要最基础的工厂模式。
2.结构型模式
适配器模式、装饰器模式、代理模式、桥接模式、外观模式、组合模式、享元模式。初级阶段需要掌握的是适配器模式和装饰器模式。
3.行为型模式
有11种:策略(strategy)模式、模板方法模式、观察者模式、责任链模式、访问者模式、中介者模式、迭代器模式、命令模式、状态模式、备忘录模式、解释器模式。学习时需要优先掌握策略(strategy)模式、模板模式、迭代器模式和访问者模式。 -
strategy模式的主要优点体现在如下几个方面:
1.提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码。
2.提供了对开闭原则(OCP)的完美支持,可以在不修改原代码的情况下,灵活增加新算法。
3.把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离。
简而言之,该模式能将数据(Context)和算法(Strategy)解耦,算法可以灵活地演化而不必修改数据操作相关代码,反之亦然。同时能够消除代码中可能出现的大量if else。 -
strategy策略模式的定义很简单,本质上就是定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。往往通过委派Delegation实现该策略。
-
strategy策略的使用方法用一个简单例子可以很好说明。
例如拿常见的支付场景举例, 先定义一个购物车支付场景,有一个pay方法支付,形参是一种支付策略:public class ShoppingCart { ```` public void pay (PaymentStategy paymentStategy) { int cost = calculate(); // 通过dependency临时委派调用支付方法。 paymentStategy.pay(cost); } }
模拟客户端代码如下:
(这里体现了策略模式的缺点,客户端需要清楚各个策略的作用以及调用方法)public class ShoppingCartTest { ```` public static void main(String[] args) { ShoppingCart cart = new ShoppingCart(); Goods goods = new Goods("牙膏", 12); cart.addGoods(goods); //选好货物后可以用两种不同策略(客户端需要知道有哪些策略可以使用) // 先使用Paypal支付策略 cart.pay(new PaypalStrategy("paypalemial@paypal.com", "password")); // 再使用CraditCard支付策略 cart.pay(new CreditCardStrategy ("Name", "ccNum", "cvv", "expiryDate")); } }
支付方法被抽象成接口,使用不同的策略来实现。设计strategy接口:
public interface PaymentStrategy { public void pay(int cost); }
设计不同pay策略,即写出不同的实现该接口的策略, 此处以CreditCardStrategy 与 PaypalStrategy举例:
pubic class CreditCardStrategy implements PaymentStrategy{ /*````rep*/ // 不同策略一般有不同的构造方法 public CreditCardStrategy (String name, String ccNum, String cvv, String expiryDate){`````} @Override public void pay(int cost) { System.out.println(cost + " cost with credit card"); } }
pubic class PaypalStrategy implements PaymentStrategy{ /*````rep*/ public PaypalStrategy (String email, String pwd){`````} @Override public void pay(int cost) { System.out.println(cost + " cost with Paypal"); } }
综上,策略模式的主要角色如下。
1.抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。例子中PaymentStrategy就是抽象策略。
2.具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。例子中CreditCardStrategy 与 PaypalStrategy是具体策略。
3.环境(Context)类:持有一个策略类的引用,最终给客户端调用。有ShoppingCart能提供用户使用不同策略的机会。结构图如下: