java设计模式种strategy模式简述与使用

java设计模式种模式简述与使用
/10/12 15:25:08
模式简述与使用
java设计模式概述:
为了提高代码的可读性,可扩展性以及代码的复用性,为了解决在写代码过程中遇到的代码设计问题,全世界开发人员集众智总结出许多优秀的代码设计模式 。
java的设计模式众多,有23种,大致可以分为三类:
1.创造型模式
有工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式 。初级阶段需要掌握最重要最基础的工厂模式 。
2.结构型模式
适配器模式、装饰器模式、代理模式、桥接模式、外观模式、组合模式、享元模式 。初级阶段需要掌握的是适配器模式和装饰器模式 。
3.行为型模式
有11种:策略()模式、模板方法模式、观察者模式、责任链模式、访问者模式、中介者模式、迭代器模式、命令模式、状态模式、备忘录模式、解释器模式 。学习时需要优先掌握策略()模式、模板模式、迭代器模式和访问者模式 。
模式的主要优点体现在如下几个方面:
1.提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码 。
2.提供了对开闭原则(OCP)的完美支持,可以在不修改原代码的情况下,灵活增加新算法 。
3.把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离 。
简而言之,该模式能将数据()和算法()解耦,算法可以灵活地演化而不必修改数据操作相关代码,反之亦然 。同时能够消除代码中可能出现的大量if else 。
策略模式的定义很简单,本质上就是定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户 。往往通过委派实现该策略 。
策略的使用方法用一个简单例子可以很好说明 。
【java设计模式种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"));}}
支付方法被抽象成接口,使用不同的策略来实现 。设计接口:
public interface PaymentStrategy {public void pay(int cost);}
设计不同pay策略,即写出不同的实现该接口的策略, 此处以 与 举例:
pubicclass CreditCardStrategy implements PaymentStrategy{/*````rep*/// 不同策略一般有不同的构造方法public CreditCardStrategy (String name, String ccNum, String cvv, String expiryDate){`````}@Overridepublic void pay(int cost) {System.out.println(cost + " cost with credit card");}}
pubicclass PaypalStrategy implements PaymentStrategy{/*````rep*/public PaypalStrategy (String email, String pwd){`````}@Overridepublic void pay(int cost) {System.out.println(cost + " cost with Paypal");}}