策略模式

1.策略模式的定义:
定义一系列的算法,把它们一个个封装起来,并且使它们可互相替换。本模式使得算法可独立于使用它的客户而变化。

2.策略模式的结构和说明:
Strategy: 策略接口,用来约束一些列具体的策略算法。Context使用这个接口来调用具体的策略实现定义的算法。
ConcreteStrategy: 具体的策略实现,也就是具体的算法实现。
Context: 上下文,负责和具体的策略类交互,通常上下文会持有一个真正的策略实现,上下文还可以让具体的策略类来获取上下文的数据,甚至让具体的策略类来回调上下文的方法。

3.模式实现

Strategy.java

package com.java.pattern.strategy;

/**
 * 策略,定义算法的接口
 */
public interface Strategy {

	// 某个算法的接口,可以有传入参数,也可以有返回值
	public void algorithmInterface();
}

ConcreteStrategyA.java

package com.java.pattern.strategy;

/**
 * 实现具体的算法
 */
public class ConcreteStrategyA implements Strategy {

	public void algorithmInterface() {
		// 具体的算法实现
		System.out.println("ConcreteStrategyA--algorithmInterface()");
	}
}

ConcreteStrategyB.java

package com.java.pattern.strategy;

/**
 * 实现具体的算法
 */
public class ConcreteStrategyB implements Strategy {

	public void algorithmInterface() {
		// 具体的算法实现
		System.out.println("ConcreteStrategyB--algorithmInterface()");
	}
}

ConcreteStrategyC.java

package com.java.pattern.strategy;

/**
 * 实现具体的算法
 */
public class ConcreteStrategyC implements Strategy {

	public void algorithmInterface() {
		// 具体的算法实现
		System.out.println("ConcreteStrategyC--algorithmInterface()");
	}
}

Context.java

package com.java.pattern.strategy;

/**
 * 上下文对象,通常会持有一个具体的策略对象
 * 
 */
public class Context {

	// 持有一个具体的策略对象
	public Strategy strategy;

	/**
	 * 构造方法,传入一个具体的策略对象
	 * 
	 * @param strategy 具体的策略对象
	 */
	public Context(Strategy strategy) {
		this.strategy = strategy;
	}

	/**
	 * 上下文对客户端提供的操作接口,可以有参数和返回值
	 */
	public void contextInterface() {
		// 通常会转调具体的策略对象进行算法运算
		strategy.algorithmInterface();
	}
}

Client.java

package com.java.pattern.strategy;

/**
 * 客户端
 */
public class Client {
	public static void main(String[] args) {
		// 创建具体的策略实现对象ConcreteStrategyA
		Strategy strategyA = new ConcreteStrategyA();
		Context contextA = new Context(strategyA);
		contextA.contextInterface();

		// 创建具体的策略实现对象ConcreteStrategyB
		Strategy strategyB = new ConcreteStrategyB();
		Context contextB = new Context(strategyB);
		contextB.contextInterface();
	}
}


运行结果:
ConcreteStrategyA--algorithmInterface()
ConcreteStrategyB--algorithmInterface()

4.思考策略模式
A,策略模式的本质:分离算法,选择实现

B,何时选用策略模式,建议在以下情况中选用:
1), 出现有许多相关的类,仅仅是行为有差别的情况下,可以使用策略模式来使用多个行为中的一个来配置一个类的方法,实现算法动态切换。
2), 出现同一个算法,有很多不同实现的情况下,可以使用策略模式来把这些"不同的实现"实现成为一个算法的类层次。
3), 需要封装算法中,有与算法相关数据的情况下,可以使用策略模式来避免暴露这些跟算法相关的数据结构。
4), 出现抽象一个定义了很多行为的类,并且是通过多个if-else语句来选择这些行为的情况下,可以使用策略模式来代替这些条件语句。

posted @ 2016-08-26 13:20  行走的思想  阅读(9)  评论(0编辑  收藏  举报  来源