`

软件设计模式 策略模式 Strategy Pattern

阅读更多

 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.)   Context(应用场景):   1、需要使用ConcreteStrategy提供的算法。   

2、内部维护一个Strategy的实例。  

3、负责动态设置运行时Strategy具体的实现算法。  

4、负责跟Strategy之间的交互和数据传递。  

Strategy(抽象策略类):  

1、定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。  

ConcreteStrategy(具体策略类):

2、 实现了Strategy定义的接口,提供具体的算法实现。

应用场景:

  1、多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。(例如FlyBehavior和QuackBehavior)

  2、需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。(例如FlyBehavior和QuackBehavior的具体实现可任意变化或扩充)

  3、 对客户(Duck)隐藏具体策略(算法)的实现细节,彼此完全独立。

UML图示:

策略模式的实现
–策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。
–策略模式使得算法可以在不影响到客户端的情况下发生变化。使用策略模式可以把行为和环境分割开来。
–环境类负责维持和查询行为类,各种算法则在具体策略中提供。由于算法和环境独立开来,算法的修改都不会影响环境和客户端

策略模式的编写步骤
–1.对策略对象定义一个公共接口。
–2.编写策略类,该类实现了上面的公共接口
–3.在使用策略对象的类中保存一个对策略对象的引用。
–4.在使用策略对象的类中,实现对策略对象的set和get方法(注入)或者使用构造方法完成赋值

•策略模式的缺点
–1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
–2.造成很多的策略类。

•解决方案
–采用工厂方法

测试:演示两个数的加、减、乘、除运算

一:

建立一个策略的接口

package collection2;

public interface Strategy
{
public int calculate(int a,int b);
}

 二:

实现一组策略的方法类

package collection2;


public class AddStrategy implements Strategy
{

public int calculate(int a, int b)
{
return a + b;
}

}

package collection2;

public class SubtractStrategy implements Strategy
{
public int calculate(int a, int b)
{
return a - b;
}
}

package collection2;


public class MultiplyStrategy implements Strategy
{

public int calculate(int a, int b)
{
return a * b;
}

}

package collection2;

public class DivideStrategy implements Strategy
{

public int calculate(int a, int b)
{
return a / b;
}

}

 三:

定义一个策略对象类,实现对策略对象的set和get方法(注入)或者使用构造方法完成赋值

package collection2;


public class Environment
{
private Strategy strategy;


public Environment(Strategy strategy)
{
this.setStrategy(strategy);
}


public void setStrategy(Strategy strategy)
{
this.strategy = strategy;
}


public Strategy getStrategy()
{
return strategy;
}


public int calculate(int a, int b)
{
return strategy.calculate(a, b);
}

}

 四:

构建一个策略的客服端类,对我们上面定义的策略模式进行测试

package collection2;


public class Client
{
public static void main(String[] args)
{
AddStrategy addStrategy = new AddStrategy();
// 加法策略
Environment environment = new Environment(addStrategy);
System.out.println("加法策略" + environment.calculate(8, 2));

// 减法策略
SubtractStrategy subtractStrategy = new SubtractStrategy();
environment.setStrategy(subtractStrategy);
System.out.println("减法策略:" + environment.calculate(8, 2));

// 乘法策略
MultiplyStrategy multiplyStrategy = new MultiplyStrategy();
environment.setStrategy(multiplyStrategy);
System.out.println("乘法策略:" + environment.calculate(8, 2));

// 除法策略
DivideStrategy divideStrategy = new DivideStrategy();
environment.setStrategy(divideStrategy);
System.out.println("除法策略:" + environment.calculate(8, 2));

}
}

 测试结果:

加法策略10
减法策略:6
乘法策略:16
除法策略:4

分享到:
评论

相关推荐

    设计模式之策略模式(Strategy Pattern)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或时间点执行不同算法的情况。策略模式提供了一种灵活的方式来处理这种情况,通过将每种算法封装为一个...

    设计模式之策略模式(Strategy Pattern)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件设计中,我们经常遇到需要在不同时间或根据不同条件使用不同算法的情况。策略模式允许我们将算法封装到独立的可互换的策略类中,从而使它们可以...

    策略模式 Strategy Pattern

    策略模式是一种行为设计模式,它使得算法可以在运行时被更改。这种模式允许一个类的行为或其算法在运行时根据需要进行改变,通过这种方式,我们可以轻松地扩展不同的算法而不修改现有代码。 #### 主要问题 在软件...

    设计模式 之 “策略模式[Strategy Pattern]”

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或时间点执行不同算法的情况。策略模式提供了一种将算法族封装到各自独立的类中,并让它们之间可以互相...

    UML及软件设计模式

    设计模式是在特定上下文中解决常见问题的可重用解决方案,它是软件设计中的最佳实践。设计模式提供了一种标准化的方法,帮助开发者避免重复发明轮子,提高代码质量和可维护性。 1. **工厂模式(Factory Pattern)** ...

    软件设计模式 L02-Strategy.ppt

    策略模式(Strategy Pattern)是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需求的变化,特别是在涉及行为或者算法的时候。策略模式提供了一种方式来封装一系列相关的算法,并使...

    我的软件设计模式小结

    其次,策略模式(Strategy Pattern)是一种行为设计模式,允许我们在运行时改变对象的行为。它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用它的客户。在实际开发中...

    C++设计模式(Design Pattern)范例源代码

    23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm” 供参考。 注:项目在 VS2008 下使用。 创建型: 抽象工厂模式(Abstract Factory) ...

    C#版 24种设计模式

    备忘录模式(Memento Pattern) 策略模式(Strategy Pattern) 抽象工厂模式(Abstract Factory Pattern) 代理模式(Proxy Pattern) 单例模式(Singleton Pattern) 迭代器模式(Iterator Pattern) 访问者模式(Visitor ...

    设计模式之蝉

    除了创建型模式,内容中还提到了“策略模式”(Strategy pattern),属于行为型设计模式。它定义了算法族,分别封装起来,使它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。在内容中提到的“我可以...

    C#设计模式_设计模式_C#_

    创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4.... 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)

    用Java实现23种设计模式

    用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...

    JAVA设计模式例程-策略模式

    在众多的设计模式中,策略模式(Strategy Pattern)是一种行为设计模式,它使你能在运行时改变对象的行为。在这个“JAVA设计模式例程-策略模式”的压缩包中,我们可以深入探讨策略模式的原理及其应用。 策略模式的...

    JAVA 23种设计模式(全).Design Pattern_Java模式

    在软件开发领域,设计模式是经过时间和实践验证的解决方案,用于解决常见的编程问题。Java作为一款广泛应用的面向对象编程语言,充分利用设计模式可以提高代码的可读性、可维护性和可扩展性。本资料包“JAVA 23种...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    1、策略模式STRATEGY PATTERN 2、代理模式PROXY PATTERN 3、单例模式SINGLETON PATTERN 4、多例模式MULTITION PATTERN 5、工厂方法模式FACTORY METHOD PATTERN 6、抽象工厂模式ABSTRACT FACTORY PATTERN 7、门面模式...

    设计模式整理代码-pattern.zip

    在IT行业中,设计模式是软件开发中的一种标准解决方案,它代表了在特定上下文中解决常见问题的最佳实践。这里我们关注的是一个名为"pattern.zip"的压缩包文件,它包含了23种经典的设计模式,这些模式在实践中被广泛...

    您的设计模式.pdf。

    在软件开发中,设计模式是一种解决特定问题的通用方法。它可以帮助开发者编写更加灵活、可维护、可扩展的代码。本书《您的设计模式》对设计模式进行了详细的讲解,涵盖了策略模式、代理模式、单例模式、多例模式、...

    设计模式_策略模式.zip

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 策略模式java-demo 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...

Global site tag (gtag.js) - Google Analytics