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

策略模式:
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);
	}
}


 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值