设计模式之策略模式

来源:互联网 发布:java中的thread.sleep 编辑:程序博客网 时间:2024/05/29 14:50


一.了解(都是跟张龙老师的视频学的):

         1.策略模式:a)封装变化的概念。b) 编程中使用接口,而不是对接口的实现。这是面向接口的编程。

            2.策略模式的定义:

                a)定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。

                b)策略模式是这些算法在客户端调用它们的时候能够互不影响

            3.策略模式的组成:

               a)抽象策略角色:策略类,通常由接口或者抽象类实现。

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

               c)环境角色:持有一个策略的引用,最终给客户端接口调用。

             4.优缺点:   (摘自http://baike.baidu.com/link?url=T3Fpty2310_993qBWywzLmlhWQu8tdjGfCkyyDp2mw0ZFhicl8h5_g8EcK1dxL-lvKRfc9WM9MUuHmkLjJsUrq)         

优点:
1、 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码。
2、 策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为。如果不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法或行为。但是,这样一来算法或行为的使用者就和算法或行为本身混在一起。决定使用哪一种算法或采取哪一种行为的逻辑就和算法或行为的逻辑混合在一起,从而不可能再独立演化。继承使得动态改变算法或行为变得不可能。
3、 使用策略模式可以避免使用多重条件转移语句。多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办法还要原始和落后。
缺点:
1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。
2、 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。

    

 

二.实现:

第一步:

public interface Strategy {          public int calculate(int x,int y);}

第二步:

public class Addition implements Strategy{     @Overridepublic int calculate(int x, int y) {// TODO Auto-generated method stubreturn x + y;}}

public class Subtraction implements Strategy{@Overridepublic int calculate(int x, int y) {// TODO Auto-generated method stubreturn x - y;}}


  

public class Division implements Strategy{@Overridepublic int calculate(int x, int y) {// TODO Auto-generated method stubreturn x / y;}}

public class Multiplication implements Strategy{@Overridepublic int calculate(int x, int y) {// TODO Auto-generated method stubreturn x * y;}}


  

第三步:

public class Environment {          private Strategy strategy;                    public Environment(Strategy strategy){                    this.strategy = strategy ;                    }  public void setStrategy(Strategy strategy) {this.strategy = strategy;  }    public int calculate(int x,int y){    return strategy.calculate(x,y);  }          }



测试:

public class Test {         public static void main(String[] args) {                 //使用加法,就是使用策略对象的类         Addition  add = new Addition();         Environment environment = new Environment(add);         System.out.println("加法:"+environment.calculate(1,1));               //使用减法         Subtraction sub = new Subtraction();         environment.setStrategy(sub);         System.out.println("减法:"+environment.calculate(1,1));                 //使用乘法         Multiplication mul = new Multiplication();         environment.setStrategy(mul);         System.out.println("乘法:"+environment.calculate(1,1));                  //使用除法         Division div = new Division();         environment.setStrategy(div);         System.out.println("除法:"+environment.calculate(4,2));         }}


打印:

加法:2减法:0乘法:1除法:2

此为策略模式在具体计算方式不一样的情况下的用法,

常用于以下场合:
1、排序算法
2、不一样的打折策略
3、所有都一样,只有实现策略不一样的场合。



参照:http://blog.csdn.net/u010708662/article/details/17053821

0 0