设计模式:结构型模式:策略模式

587 阅读3分钟

概述

  1. 策略模式将各种不同类型所对应的不同执行逻辑抽象成算法族(策略组),并分别封装起来,让他们之间可以互相替换,这样就将算法的变化和使用算法的客户端分离开来;
  2. 这样体现了几个设计原则,第一、把变化的代码从不变的代码中分离出来;第二、针对接口编程而不是具体类(定义了策略接口);第三、多用组合/聚合,少用继承(客户通过组合方式使用策略)。
  3. 进一步阐述:策略模式就是解决具体逻辑和客户端耦合在一起的问题,其核心是找到项目中变化的部分并进行抽离出来成为一个接口,项目中不变的部分就直接使用接口调用抽象方法即可。
  4. 与责任链不同的是,策略 开始就知道 不同类型可以找出不同的算法,而责任链则开始则不知道是什么类型,必须从第一个链对象一层层判断解析,才能够确定是链上哪一个对象能够处理。

角色

  1. Context(环境角色):用来操作策略的上下文环境,它持有一个Strategy的引用;
  2. Strategy(抽象策略角色):所有策略的抽象,封装了需要去执行的项目中不变的部分逻辑;
  3. ConcreteStrategy (具体策略角色):抽象策略的实现,每一种不同的逻辑执行方式就是一个具体的策略类;

Example

  1. 我们设计一个使用不同交通工具去旅行的策略
/**
 * 旅行者类(Context)
 * @author Peter
 */
public  class Traveler {
	
	private TravelingStrategy travelingStrategy;

	public Traveler(TravelingStrategy travelingStrategy) {
		this.travelingStrategy = travelingStrategy;
	}
	
	public void  goTraveling(){
		//if-- else if -- else if
		travelingStrategy.goTraveling();
	}
}

/**
 * 旅行策略接口
 * @author Peter
 */
public interface TravelingStrategy {

	/**
	 * 去旅游方法
	 */
    void goTraveling();
    
    //其它抽象方法
}


/**
 * 飞机旅行策略实现类
 * @author Peter
 */
public class AirTravelingStrategy implements TravelingStrategy{

	@Override
	public void goTraveling() {
		System.out.println("乘坐飞机去旅行……");
	}
}

/**
 * 高铁旅行策略实现类
 * @author Peter
 */
public class HightTrainTravelingStrategy implements TravelingStrategy{

	@Override
	public void goTraveling() {
		System.out.println("乘坐高铁去旅行……");
	}
}

模块一 使用策略模式.jpg

总结

  1. 客户端增加行为不用修改原有代码,只要添加一种策略(或者行为)即可,避免了使用if--else if--else if去完成逻辑的编程的情况,是典型的if--else if--else if的“杀手”,因为遵守了开闭原则(OCP原则),所以极大地提高了软件的可扩展性、可维护性;
  2. 策略模式的核心思想是:多用组合或者聚合少用继承;用行为类进行组合,而不是行为类进行继承,这样耦合度降低了,这样就替换了用继承关系解决问题的办法,策略模式将算法封装在独立的 Strategy 类中使得你可以独立于其 Context 改变它,使它易于切换、易于理解、易于扩展遵守了合成复用原则;
  3. 使用策略模式的客户端必须知道所有的策略类,并自行决定使用哪一个策略类;
  4. 电商项目的优惠活动管理: 优惠的策略有很多种,包括满减类型优惠策略、打折类优惠策略、赠送礼品策略、发放优惠券策略。