您的位置:首页 > 其它

行为模式之策略模式注解

2011-11-07 08:21 176 查看
策略模式是对象的行为模式,对模式的分类中,到底是对象的模式还是类的模式,主要是看对象是对象之间的关系而言的,如果是在运行时期动态地决定到底引用哪一个对象,则这种关系就是对象模式,而如果是在编译阶段就确定了对象之间的关系,则这样的关系在运行期是不能改变的,则这种模式就是类的模式。

策略模式是对某种类似的算法的集中封装,然后统一向外提供接口。对于调用者而言只需要确认需要哪种策略,就直接创建(或者获取)对应的策略对象,再调用对应的策略方法即可,调用者不用关心策略内部的具体实现,这是一种将调用者与策略具体内容进行责任分隔的方法。在使用策略模式时,一个重要的特点是同一次调用中,只能选取一种策略进行调用,而不能同时调用多种策略,这不是一种过滤链或者责任链模式。

下图为典型的策略模式的静态UML类图:



环境Context持有一个对Strategy的引用。外部需要策略时,从环境Context中进行获取。

下面是一些典型Java代码:

Context类的代码如下:

public class Context
{
private Strategy strategy;
//提供了一个注入外部策略的方法。
public voidsetStragegy(Strategy st)
{
strategy = st;
}
public void contextInterface()
{
strategy.strategyInterface();
}
}

抽象类Strategy代码如下:

abstract public class Strategy
{
public abstract void strategyInterface();
}

具体策略类代码如下:

public class ConcreteStrategy extends Strategy
{
public voidstrategyInterface()
{
//write youalgorithm code here
}
}

在策略模式中,抽象策略可以是接口也可以是抽象类,在实际应用中抽象类较多,因为策略会有一些公共的方法,比如设置参数什么的,而这些方法都是一样的,只是具体的策略方法内容不一样,所以可以将这些公共的方法集中的基类中,即提升到抽象类中。这种方式需要与模版方法模式区别开来,模版方法模式的典型特征是调用模版方法,而策略模式是典型特征是调用策略方法(即如果存在抽象基类的情况下)。模版方法模式中的方法会调用抽象方法,而策略模式中的策略方法通常会调用基类公共方法。区别还是挺大的。

在上面的类结构以及代码中,有个地方需要明确一下,就是什么时候决定调用什么策略,这个责任由谁来承担,可以考虑由Context进行承担,即Context此时则应该是一个单例类,其里面含有多种策略的引用,然后提供一个方法进行判定在什么情况下使用什么策略。当然也可以根据业务需求由其他对象承担该责任。而有许多的策略的情况下是动态地进行策略对象的创建还是初始化时就创建,则由具体的业务需求进行确定。

从上面可以看出来,面向对象中的一个重要特点,就是责任的承担,通常一个对象是一个责任体,其只应该承担自己应该且能够承担的责任,而不应该提供以及承担其不应该承担的责任。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: