当前位置:编程学习 > JAVA >>

策略模式及与简单工厂模式的结合

策略模式:
1.策略模式动机:完成一项任务有多种不同的方式,每一种方式称为一种策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。
在软件开发中常常遇到这种情况:实现某一功能有多种途径,此时可以使用一种设计模式来使系统可以灵活的选择解决途径,也能够方便的增加新的
解决途径。
2.策略模式是对象的行为模式,用意是对一组算法的封装。动态的选择需要的算法并使用
 
上例中的人出行方式有多种,通过封装出行的方法,动态的选择需要的算法并使用。
3.策略模式角色:
 (1)抽象策略角色:通常用一个抽象类或者接口来实现,主要是定义这个算法所完成的功能
 (2)具体策略角色:包装了相关算法和行为
 (3)环境角色:持有策略类的引用
对应上图中: 抽象策略模式 <---> 旅行出行方式
             具体策略角色 <---> 骑车,骑车,火车,飞机
             环境角色 <---> 人(对策略的使用)
 
 
环境类:Context
4.策略模式比较简单和并易于使用,策略模式是对算法的封装,它把算法的职责和和算法本身分隔开,委派不同的对象管理。
策略模式通常将一系列算法封装到一系列的策略类里面,作为一个抽象策略类的子类,换一句话说:“准备一组算法,并将每一个算法封装起来,使得他们可以互换”。
5.优缺点
优点:
(1)动态改变算法或行为
(2)简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试
缺点:客户端必须知道所有的策略类,并自行决定使用哪一个策略类,必须对每一个算法了解
6.策略模式与简单工厂模式的结合
在Context环境角色类中结合简单工厂模式,即在Context中设计构造函数,传入自变量,环境角色根据传入的自变量选择使用的算法,
这样的缺点是客户端在使用前要具备识别Context的能力,即知道参数的含义。
 
下面是实例代码
 
[java]  
package Strategy;  
/*抽象策略角色*/  
public interface IOperate   
{  
    public double getResult(double a, double b);  
}  
 
[java]  
package Strategy;  
/*具体策略角色加法算法*/  
public class Addition implements IOperate  
{  
    public double getResult(double a, double b)  
    {  
        return a + b;  
    }  
}  
 
[java]  
package Strategy;  
  
public class Multiplication implements IOperate  
{  
    public double getResult(double a, double b)  
    {  
        return a*b;  
    }  
}  
 
[java]  
package Strategy;  
import java.util.*;  
/*环境角色,持有策略类的引用*/  
public class Context   
{  
    IOperate opr = null;  
    public Context(){};  
    public Context(int flag)  
    {/*简单工厂模式,Context相当于工厂,根据传入的flag决定生产哪个产品,但是客户端需要有识别 
    Context的能力,即参数的含义*/  
        switch(flag)  
        {  
        case 1:  
        {  
            opr = new Addition();  
            break;  
        }  
        case 2:  
        {  
            opr = new Multiplication();  
            break;  
        }  
        default :  
        {  
            break;  
        }  
        }  
    }  
    public final static Addition add = new Addition(); /*纯策略模式方式*/  
    public final static Multiplication multi = new Multiplication();  
}  
 
MAIN函数
[java]  
package Strategy;  
  
public class Main   
{  
    public static void main(String[] args)   
    {  
        Context context = new Context(); /*创建环境角色*/  
        double ret = context.add.getResult(12.0, 23.99);  
        System.out.println("context.add.getResult(12.0, 23.99) = " + ret);  
        ret = context.multi.getResult(12.0, 4);  
        System.out.println("context.multi.getResult(12.0, 4) = " + ret);  
        /*策略模式和简单工厂模式结合*/  
        Context contFac = new Context(2);/*要事先知道传入2代表什么,这是缺点*/  
        ret = contFac.opr.getResult(2, 23);  
        System.out.println("conFac.opr.getResult(2, 23) = " + ret);  
    }  
}  
 
 
 
补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,