设计模式-策略模式

来源:《设计模式之禅》

定义:定义一组算法,将每个算法封装起来,并且算法之间可以相互转换。

策略模式三种角色:

  1. 上下文角色context:屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。

  2. 抽象策略角色,定义每个策略或算法需要的方法和属性。

  3. 具体策略角色,实现抽象策略角色定义的方法。

类图:

设计模式-策略模式_第1张图片

代码:

抽象策略类:

/**
 * 
 */
package cc.rico.pattern.strategy;

/**
 * @author rico
 * 抽象策略类
 */
public interface Strategy {
	
	/**
	 * 策略方法
	 */
	public void action();
}

具体策略类:

/**
 * 
 */
package cc.rico.pattern.strategy;

/**
 * @author rico
 * 具体策略类
 */
public class ConcreteStrategy1 implements Strategy {

	/* (non-Javadoc)
	 * @see cc.rico.pattern.strategy.Strategy#action()
	 */
	@Override
	public void action() {
		System.out.println("###ConcreteStrategy1.action...");
	}

}
/**
 * 
 */
package cc.rico.pattern.strategy;

/**
 * @author rico
 * 具体策略类
 */
public class ConcreteStrategy2 implements Strategy {

	/* (non-Javadoc)
	 * @see cc.rico.pattern.strategy.Strategy#action()
	 */
	@Override
	public void action() {
		System.out.println("###ConcreteStrategy2.action...");
	}

}

上下文:

/**
 * 
 */
package cc.rico.pattern.strategy;

/**
 * @author rico
 * 上下文
 */
public class Context {
	private Strategy strategy = null;
	
	// 
	public Context(Strategy strategy) {
		this.strategy = strategy;
	}
	
	// 
	public void option() {
		this.strategy.action();
	}
}

场景类:

/**
 * 
 */
package cc.rico.pattern.strategy;

/**
 * @author rico
 * 场景类
 */
public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		Strategy strategy1 = new ConcreteStrategy1();
		Strategy strategy2 = new ConcreteStrategy2();
		
		Context context = new Context(strategy1);
		context.option();
		
		context = new Context(strategy2);
		context.option();
		
	}

}

策略模式优点:

  1. 算法可以自由切换

  2. 避免使用多重条件判断

  3. 扩展性良好,添加一个策略,只需实现抽象策略角色接口。

策略模式缺点:

  1. 算法多,类膨胀。

  2. 所有的策略需要对外暴露。

使用场景:

  1. 多个类只有在算法或行为上稍微不同。

  2. 算法需要自由切换。

  3. 需要屏蔽算法规则。

扩展:


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