学习总结(二):设计模式之策略模式

前言

上次更了简单工厂模式的介绍,这次来介绍一下我对策略模式的理解。

介绍

先给出策略模式的概念:它定义了算法家族,分别封装起来,让它们之前可以相互替换,此模式让算法的变化,不会影响到使用算法的客户
我结合例子(上一篇博客的例子),对此是这样理解的:
在这模式下总共有四个角色
1.客户端:客户端就是用户的操作界面,用户在这里选择哪种策略去执行。
2.抽象策略角色:这个是一个抽象的角色,通常情况下使用接口或者抽象类去实现。比如说我要实现超市减价,这个角色里就有“减价”这样的一个抽象方法
3.具体策略角色:这个角色用于具体实现抽象策略角色定义的抽象方法
4.环境角色:为了体现算法家族的封装性,不能直接在客户端去实例化一个策略,所以将策略交给环境角色来配置,在环境角色里面构造并返回一个策略的引用。
总的来说,策略模式封装了变化

分析及代码

基于上一次的例子,我们可以用一个Context(环境角色)维护对策略的引用,然后在客户端部分实现。这样做的话,客户端还是要分几种情况去选择实例化Context类,所以结合工厂模式,把Context也看作一个工厂,将选择的情况放在Context里去执行。以下是代码:

/**环境角色*/
public class CashContext{
	CashSuper cs = null;
	public CashContext(int type) {
		switch(type) {
		case 1:
			cs = new CashNormal();
			break;
		case 2:
			CashReturn cr1 = new CashReturn(300,30);
			cs = cr1;//向上转型
			break;
		case 3:
			CashRebate cr2 = new CashRebate(0.8);
			cs = cr2;//向上转型
			break;
		}
	}
	public double GetResult(double money) {//返回重载后的方法
		return cs.acceptCash(money);//对于case1,case2,该方法是被重载后的方法
	}
	/**客户端部分*/
	public static void main(String args[]) {
		Scanner in = new Scanner(System.in);
		System.out.println("请选择收费类型\n1.正常收费\n2.满300减30\n3.打0.8折");
		int type = in.nextInt();
		System.out.println("请输入原价:");
		double money = in.nextDouble();
		CashContext cc=new CashContext(type);
		double newMoney = cc.GetResult(money);
		System.out.println("现价钱:\n"+String.valueOf(newMoney)+"\n");
	}
}

可以看出,和上一篇工厂模式的代码区别并不大,但还是有不同之处的,具体体现在客户端部分。简单工厂模式的客户端需要识别两个类:CashSuper,CashFactory,而策略模式下客户端只用识别CashContext类。以下是代码区别:

//简单工厂下客户端对策略的实例化
CashSuper csuper =CashFactory.createCashAccept(type);
		double newMoney = csuper.acceptCash(money);
//策略模式下客户端对策略的实例化
CashContext cc=new CashContext(type);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值