您的位置:首页 > 其它

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

2012-12-19 15:03 218 查看
策略模式:

1.策略模式动机:完成一项任务有多种不同的方式,每一种方式称为一种策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。

在软件开发中常常遇到这种情况:实现某一功能有多种途径,此时可以使用一种设计模式来使系统可以灵活的选择解决途径,也能够方便的增加新的

解决途径。

2.策略模式是对象的行为模式,用意是对一组算法的封装。动态的选择需要的算法并使用

 


上例中的人出行方式有多种,通过封装出行的方法,动态的选择需要的算法并使用。

3.策略模式角色:

 (1)抽象策略角色:通常用一个抽象类或者接口来实现,主要是定义这个算法所完成的功能

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

 (3)环境角色:持有策略类的引用

对应上图中: 抽象策略模式 <---> 旅行出行方式

             具体策略角色 <---> 骑车,骑车,火车,飞机

             环境角色 <---> 人(对策略的使用)

 

环境类:Context

4.策略模式比较简单和并易于使用,策略模式是对算法的封装,它把算法的职责和和算法本身分隔开,委派不同的对象管理。

策略模式通常将一系列算法封装到一系列的策略类里面,作为一个抽象策略类的子类,换一句话说:“准备一组算法,并将每一个算法封装起来,使得他们可以互换”。

5.优缺点

优点:

(1)动态改变算法或行为

(2)简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试

缺点:客户端必须知道所有的策略类,并自行决定使用哪一个策略类,必须对每一个算法了解

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

在Context环境角色类中结合简单工厂模式,即在Context中设计构造函数,传入自变量,环境角色根据传入的自变量选择使用的算法,
这样的缺点是客户端在使用前要具备识别Context的能力,即知道参数的含义。

下面是实例代码

package Strategy;
/*抽象策略角色*/
public interface IOperate
{
public double getResult(double a, double b);
}

package Strategy;
/*具体策略角色加法算法*/
public class Addition implements IOperate
{
public double getResult(double a, double b)
{
return a + b;
}
}

package Strategy;

public class Multiplication implements IOperate
{
public double getResult(double a, double b)
{
return a*b;
}
}

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函数
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);
}
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: