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

strategy模式简述与使用
  1. java设计模式概述:
    为了提高代码的可读性,可扩展性以及代码的复用性,为了解决在写代码过程中遇到的代码设计问题,全世界开发人员集众智总结出许多优秀的代码设计模式。

    java的设计模式众多,有23种,大致可以分为三类:
    1.创造型模式
    有工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。初级阶段需要掌握最重要最基础的工厂模式。
    2.结构型模式
    适配器模式、装饰器模式、代理模式、桥接模式、外观模式、组合模式、享元模式。初级阶段需要掌握的是适配器模式和装饰器模式。
    3.行为型模式
    有11种:策略(strategy)模式、模板方法模式、观察者模式、责任链模式、访问者模式、中介者模式、迭代器模式、命令模式、状态模式、备忘录模式、解释器模式。学习时需要优先掌握策略(strategy)模式、模板模式、迭代器模式和访问者模式。

  2. strategy模式的主要优点体现在如下几个方面:
    1.提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码。
    2.提供了对开闭原则(OCP)的完美支持,可以在不修改原代码的情况下,灵活增加新算法。
    3.把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离。
    简而言之,该模式能将数据(Context)和算法(Strategy)解耦,算法可以灵活地演化而不必修改数据操作相关代码,反之亦然。同时能够消除代码中可能出现的大量if else。

  3. strategy策略模式的定义很简单,本质上就是定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。往往通过委派Delegation实现该策略。

  4. 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("[email protected]", "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能提供用户使用不同策略的机会。

    结构图如下:
    java设计模式种strategy模式简述与使用_第1张图片

你可能感兴趣的:(java,设计模式,策略模式)