天天看点

设计模式---策略模式

定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

策略模式

通俗一点来说就是把 if 判断语句给封装了,提高了代码的扩展性和可维护性. 对外隐藏了具体的算法实现.

?示意图:
设计模式---策略模式
三个角色:

● 环境(Context)角色:持有一个Strategy的引用。

● 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

● 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

这个图有点类是于门面模式,但是值得注意的是?门面模式是对所有方法进行一个封装.这里只是对某个方法.

应用场景

策略模式的用意是针对一组算法或逻辑,将每一个算法或逻辑封装到具有共同接口的独立的类中,从而使得它们之间可以相互替换。策略模式使得算法或逻辑可以在不影响到客户端的情况下发生变化。说到策略模式就不得不提及OCP(Open Closed Principle) 开闭原则,即对扩展开放,对修改关闭。策略模式的出现很好地诠释了开闭原则,有效地减少了分支语句。

代码案例

此代码通过模拟不同会员购物车打折力度不同分为三种策略,初级会员,中级会员,高级会员。

✍上代码:

//策略模式 定义抽象方法 所有支持公共接口
abstract class Strategy {

	// 算法方法
	abstract void algorithmInterface();

}

public class StrategyA extends Strategy {

	@Override
	void algorithmInterface() {
		System.out.println("算法A");

	}

}

public class StrategyB extends Strategy {

	@Override
	void algorithmInterface() {
		System.out.println("算法B");

	}

}

/**
 * 中间层的Context类实现了对底层实现的隐藏,更符合设计模式开闭的思想
 * @author Administrator
 * 
 */
public class Test {
	public static void main(String[] args) {
		Context context;
		context = new Context(new StrategyA());
		context.algorithmInterface();
		
		context = new Context(new StrategyB());
		context.algorithmInterface();
		
	}

}

           
策略模式的优点:
  • 算法可以自由切换;
  • 避免使用多重条件判断;
  • 扩展性良好。
策略模式的缺点:
  • 策略类会增多
  • 所有策略类都需要对外暴露

总结

策略模式的本质:

分离算法,选择实现。

如果你仔细思考策略模式的结构和功能的话,就会发现:如果没有上下文,策略模式就回到了最基本的接口和实现了,只要是面向接口编程,就能够享受到面向接口编程带来的好处,通过一个统一的策略接口来封装和分离各个具体的策略实现,无需关系具体的策略实现。

策略模式体现了开闭原则:策略模式把一系列的可变算法进行封装,从而定义了良好的程序结构,在出现新的算法的时候,可以很容易的将新的算法实现加入到已有的系统中,而已有的实现不需要修改。

策略模式体现了里氏替换原则:策略模式是一个扁平的结构,各个策略实现都是兄弟关系,实现了同一个接口或者继承了同一个抽象类。这样只要使用策略的客户端保持面向抽象编程,就可以动态的切换不同的策略实现以进行替换。