Strategy----策略模式

来源:互联网 发布:卡通艺术字软件下载 编辑:程序博客网 时间:2024/06/16 02:11

1、策略模式(Strategy Pattern)体现了两个基本的现象对象设计的原则:(1)封装变化的概念(2)编程中使用接口,而不是对接口的实现

2、策略模式的组成:

(1)抽象策略角色:策略类,一般由一个接口或者抽象类实现

(2)具体策略角色:包装了相关的算法和行为

(3)环境角色:持有一个策略类的引用,最终给客户端调用

3、策略模式的实现

(1)策略模式这对一组算法,将每一个算法封装到具有公共接口的独立的类中,从而使得它们可以相互替换

(2)策略模式使得算法可以在不影响到客户端的情况下发生变化。使用策略模式可以把行为和环境分割开来

(3)环境类负责维持和查询行为类,各种算法则在具体策略中提供。由于算法和环境是相互独立的,算法的修改不会影响环境和客户端

4.策略模式的编写步骤

(1)对策略对象定义一个公共接口

public interface Strategy {
public int  calculate(int a, int b);
}
//完成基本的算术运算

(2)编写策略类,该类实现了(1)中的公共接口

AddStrategy//完成加法的类

SubStrategy//减法

MultiplyStrategy//乘法

DivideStrategy//除法

(3)在引用策略对象的类中保存一个对策略对象的引用

public class Environment {
private Strategy strategy;
}

(4)在使用策略对象的类中,实现对策略对象的set和get方法(注入)或者使用构造方法完成赋值。

参考Collections类的源代码

public class Environment {
private Strategy strategy;
public Environment(Strategy strategy)
{
this.strategy = strategy;
}
public Strategy getStrategy() {
return strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}

}

5、调用strategy对象

public class Environment {
private Strategy strategy;
public Environment(Strategy strategy)
{
this.strategy = strategy;
}
public Strategy getStrategy() {
return strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public int calculate(int a, int b)//调用
{
return strategy.calculate(a, b);
}
}

6、客户端测试:

public class Client {
public static void main(String[] args) {
AddStrategy add = new AddStrategy();
Environment environment = new Environment(add);
System.out.println(environment.calculate(3,4));
SubStrategy sub = new SubStrategy();
environment.setStrategy(sub);
System.out.println(environment.calculate(3,  4));
MultiplyStrategy multiply = new MultiplyStrategy();
environment.setStrategy(multiply);
System.out.println(environment.calculate(3,  4));
DivideStrategy divide = new DivideStrategy();
environment.setStrategy(divide);
System.out.println(environment.calculate(3,  4));
}
}


从上面的代码可以看出来,我们在调用时只需设置具体的策略即可。从外观上看不出来我们具体调用了什么样的方法。(完成基本加减乘除没必要这么麻烦,此时只是用简单的数学运算来演示策略模式的使用)


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

解决方法:采用工厂方法(另外一种设计模式)



0 0
原创粉丝点击