1.策略模式概念
策略模式(Strategy Pattern)体现了两个非常基本的面向对象设计原则。
1> 封装变化概念 ;
2> 编程中使用接口,而不是对接口的实现,即面向接口编程。
2.定义:
1> 定义一组算法,将每个算法都封装起来,并且使他们之间可以作为组建互相替换;
2> 策略模式使这些算法在客户端调用它们的时候能够互不影响的变化。
3.意义:
1> 策略模式使开发人员能够开发出由许多可替换的部分组成的软件,并且各部分之间是
松耦合的关系;
2> 若连接的特性是软件具有更强的可扩展性,易于维护;更重要的是,他大大提高了软件
的可重用性。
4.策略模式的组成:
1> 抽象策略角色:策略类,通常由一个接口或者抽象类实现;
2> 具体策略角色:包装了相关的算法和行为,由实现接口或抽象类的类完成;
3> 环境角色:持有一个策略类的引用,最后给客户端调用。
5.策略模式的实现:
1> 策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立类中,
从而使得它们可以相互替换;
2> 策略模式使得算法可以在不影响客户端的情况下发生变化。使用策略模式可以把
行为和环境分割开来;
3> 环境类负责维持和查询行为类,各种算法则在具体策略中提供。由于算法和环境
相独立,算法的修改都不会影响环境和客户端。
6.编写步骤:
1> 对策略对象定义一个公共接口(抽象策略角色);
2> 编写各种策略类,该类实现了上面的公共接口(具体策略角色);
3> 在使用策略对象的类中保存一个策略对象的引用(环境角色);
4> 在使用策略对象的类中,实现对策略对象的set和get方法(注入)或者使用构造方法完成赋值
例1:
Strategy.java(抽象策略角色,接口实现)
package cn.edu.bupt.strategy;
public interface Strategy {
int calculate(int a, int b);
}
(具体策略角色,分为两个实现类,如下)
AddStrategy.java
1 package cn.edu.bupt.strategy;
2
3 public class AddStrategy implements Strategy {
4
5 @Override
6 public int calculate(int a, int b) {
7 return a + b;
8 }
9
10 }
11
SubstractStrategy.java
1 package cn.edu.bupt.strategy;
2
3 public class SubstractStrategy implements Strategy {
4
5 @Override
6 public int calculate(int a, int b) {
7 return a - b;
8 }
9
10 }
11
(环境角色,持有接口的引用但是没有接口的具体实现类,即面向接口编程,拥有setters 和 getters)
Environment.java
1 package cn.edu.bupt.strategy;
2
3 public class Environment {
4 private Strategy stra; //Strategy类型,面向接口编程
5
6 public Environment(){
7 super();
8 }
9 public Environment(Strategy stra) {
10 super();
11 this.stra = stra;
12 }
13
14 public Strategy getStra() {
15 return this.stra;
16 }
17
18 public void setStra(Strategy stra) {
19 this.stra = stra;
20 }
21
22 public int calculate(int a, int b) {
23 return this.stra.calculate(a, b);
24 }
25 }
26
(客户端,持有环境类,但是需要通过使用setters 和 getters向环境类中传入具体的算法,即策略具体实现类)
Client.java
1 package cn.edu.bupt.strategy;
2
3 public class Client {
4
5 /**
6 * @param args
7 */
8 public static void main(String[] args) {
9 // TODO Auto-generated method stub
10 int a = 3;
11 int b = 4;
12 //实例化环境决策,完成相关的运算
13 Environment env = new Environment();
14
15 //传入减法策略,执行减法运算
16 env.setStra(new SubstractStrategy());
17 System.out.println(env.calculate(a, b));
18
19 //传入加法策略,执行加法运算
20 env.setStra(new AddStrategy());
21 System.out.println(env.calculate(a, b));
22 }
23
24 }
策略模式的缺点:
1> 客户端必须知道所有的实现算法的具体策略类,并自行解决使用哪个策略类;
2> 会造成很多的抽象类。