随笔 - 0, 文章 - 1, 评论 - 0, 引用 - 0
数据加载中……

【转】Java策略模式

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> 会造成很多的抽象类。

posted on 2012-01-30 19:11 阿童沐 阅读(74) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: