当前位置:文档之家› 软件体系结构与设计模式__策略模式

软件体系结构与设计模式__策略模式

软件体系结构与设计模式
---------策略模式策略模式(别名:政策)
策略模式是一个很简单的模式,也是一个很常用的模式。

它定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。

策略模式让算法独立于使用它的客户而独立变化。

策略模式应用的原则就是:
找到系统中变化的部分,将变化的部分同其它稳定的部分隔开。

面向接口编程,而不要面向实现编程
优先考虑使用对象组合,而不是类继承。

一、概述
策略模式是处理算法的不同变体的一种成熟模式,策略模式通过接口或抽象类封装算法的标识,即在接口中定义一个抽象方法,实现该接口的类将实现接口中的抽象方法。

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。

策略模式让算法独立于使用它的客户而独立变化。

减少了各种算法类与使用算法类之间的耦合。

在策略模式中,封装算法标识的接口称作策略,实现该接口的类称作具体策略。

二、策略模式的结构与使用
(一)策略模式的结构中包括三种角色:
1、抽象策略角色(Strategy)
2、具体策略角色(Concrete Strategy)
3、环境角色(Context)
下图2-1为策略模式的UML类图表示
图2-1策略模式的UML类图
(二)策略模式的结构的描述与使用
下面的例子利用策略模式在排序对象中封装了不同的排序算法,这样以便允许客户端动态的替换排序策略(包括Quick sort、Shell sort和Merge sort)。

1.抽象策略(Strategy) :
// "Strategy"
abstract class Sort Strategy
{
// Methods
abstract public void Sort( ArrayList list );
}
2.具体策略(Concrete Strategy):
(1)
// "ConcreteStrategy"
class QuickSort : SortStrategy
{
// Methods
public override void Sort(ArrayList list )
{
list.Sort();
Console.WriteLine("QuickSorted list ");
}
}
(2)
// "ConcreteStrategy"
class ShellSort : SortStrategy
{
// Methods
public override void Sort(ArrayList list )
{
list.ShellSort();
Console.WriteLine("ShellSorted list ");
}
}
3.环境策略:
public class GymnasticsGame
{
ComputableStrategy strategy;
public void setStrategy(ComputableStrategy strategy)
{
this.strategy=strategy;
}
public double getPersonScore(double [] a)
{
if(strategy!=null)
return puteScore(a);
else
return 0;
}
}
三、策略模式的优点
提供了一种替代继承的方法,而且既保持了继承的优点(代码重用)还比继承更灵活(算法独立,可以任意扩展)。

避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。

遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。

由于每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量。

上下文(Context)和具体策略(Concrete Strategy)是松耦合关系。

因此上下文只知道它要使用某一个实现Strategy接口类的实例,但不需要知道具体是哪一个类。

策略模式满足“开-闭原则”。

当增加新的具体策略时,不需要修改上下文类的代码,上下文就可以引用新的具体策略的实例。

四、适合使用策略模式的情景
一个类定义了多种行为,并且这些行为在这个类中以多个条件语句的形式出现,可以使用策略模式避免在类中使用大量的条件语句。

程序不需要暴露复杂的、与算法相关的数据结构,可以使用策略模式封装算法,需要使用一个算法的不同变体。

在下面的情况下应当考虑使用策略模式:
1. 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

2. 一个系统需要动态地在几种算法中选择一种。

那么这些算法可以包装到一个个的具体算法类里面,而这些具体算法类都是一个抽象算法类的子类。

换言之,这些具体算法类均有统一的接口,由于多态性原则,客户端可以选择使用任何一个具体算法类,并只持有一个数据类型是抽象算法类的对象。

3. 一个系统的算法使用的数据不可以让客户端知道。

策略模式可以避免让客户端涉及到不必要接触到的复杂的和只与算法有关的数据。

4. 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

此时,使用策略模式,把这些行为转移到相应的具体策略类里面,就可以避免使用难以维护的多重条件选择语句,并体现面向对象设计的概念。

相关主题