您的位置:首页 > 其它

【设计模式】之策略模式

2012-05-28 03:58 218 查看

一、什么是策略模式

策略模式的目的是定义一系列算法,把它们封装起来,并且使它们可以相互替换。

策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 策略模式的好处在于你可以动态的改变对象的行为。

二、设计模式的设计原则

  设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++z中可以用虚类),然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。 

策略模式属于对象行为型模式,主要针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。通常,策略模式适用于当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用。

三、设计模式的组成

策略模式中有三个对象:

(1环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。

(2抽象策略对象:它可由接口或抽象类来实现。

(3具体策略对象:它封装了实现同不功能的不同算法。

利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有算法来实现应用程序的功能。具体的选择有环境对象来完成。采用这种方式可以避免由于使用条件语句而带来的代码混乱,提高应用程序的灵活性与条理性。

四、设计模式的实例

(1)类之间的关系



(2)代码实现

步骤一:创建接口

package study_02.designpattern.strategy;

public interface Strategy {
public int doOperation(int num1, int num2);
}

步骤二:创建具体的接口实现抽象策略对象

package study_02.designpattern.strategy;

public class OperationAdd implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}

步骤三:创建具体的接口实现抽象策略对象

package study_02.designpattern.strategy;

public class OperationSubstract implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}

步骤四:创建具体的接口实现抽象策略对象

package study_02.designpattern.strategy;

public class OperationMultiply implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 * num2;
}
}

步骤五:创建环境对象

package study_02.designpattern.strategy;

public class Context {
private Strategy strategy;

public Context(Strategy strategy){
this.strategy = strategy;
}

public int executeStrategy(int num1, int num2){
return strategy.doOperation(num1, num2);
}
}

步骤五:应用实例

package study_02.designpattern.strategy;

public class StrategyPatternDemo {
public static void main(String[] args) {
Context context = new Context(new OperationAdd());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));

context = new Context(new OperationSubstract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));

context = new Context(new OperationMultiply());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}
}

步骤六:输出结果

10 + 5 = 15
10 - 5 = 5
10 * 5 = 50

五、策略模式的缺点:

(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类,这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。

(2)策略模式造成许多的策略类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。

六、参考资料

   http://www.tutorialspoint.com/design_pattern/strategy_pattern.htm
 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: