设计模式之策略模式(Java实现)

Strategy(策略)

一、意图

定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。此模式使得算法可以独立于使用它们的客户而变化。

二、结构

策略模式的结构图如图7.46所示。
在这里插入图片描述
其中:
• Strategy (策略)定义所有支持的算法的公共接口。Context使用这个接口来调用某 ConcreteStrategy 定义的算法。
• ConcreteStrategy (具体策略)以Strategy接口实现某具体算法。
• Context (上下文)用一个ConcreteStrategy对象来配置;维护一个对Strategy对象的引用;可定义一个接口来让Strategy访问它的数据。

三、适用性

Strategy模式适用于:
• 许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
• 需要使用一个算法的不同变体。例如,定义一些反映不同空间的空间/时间权衡的算法。 当这些变体实现为一个算法的类层次时,可以使用策略模式。
• 算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
• 一个类定义了多种行为,并旦这些行为在这个类的操作中以多个条件语句的形式出现, 将相关的条件分支移入它们各自的Strategy类中,以代替这些条件语句。

四、实现

某大型购物中心欲开发一套收银软件,要求其能够支持购物中心在不同时期推出的各种促销活动,如打折、返利(例如,满 300 返 100)等等。现采用策略(Strategy)模式实现该要求,得到如图 6-1 所示的类图。

在这里插入图片描述

首先 定义一个枚举类(分别代表正常收费、打折、返利)

enum TYPE { NORMAL, CASH_DISCOUNT, CASH_RETURN};

然后 定义一个收费接口

interface CashSuper {
	public double acceptCash(double money) ;
}

其次 分别用正常收费类、打折类、返利类继承收费接口

class CashNormal implements CashSuper { // 正常收费子类
	public double acceptCash(double money) {
		return money;
	}
}

class CashDiscount implements CashSuper {
	private double moneyDiscount; // 折扣率
	public CashDiscount(double moneyDiscount) {
		this.moneyDiscount = moneyDiscount;
	}
	public double acceptCash(double money) {
		return money* moneyDiscount;
	}
}

class CashReturn implements CashSuper { // 满额返利
	private double moneyCondition;
	private double moneyReturn;
	public CashReturn(double moneyCondition, double moneyReturn) {
		this.moneyCondition = moneyCondition; // 满额数额
		this.moneyReturn = moneyReturn; // 返利数额
	}
	public double acceptCash(double money) {
		double result = money;
		if(money >= moneyCondition )
			result = money - Math.floor(money / moneyCondition) * moneyReturn;
		return result;
	}
}

再其次 定义CashContext类

class CashContext {
	private CashSuper cs;
	public CashContext(TYPE t) {
		switch(t) {
		case NORMAL: // 正常收费
			cs = new CashNormal();
			break;
		case CASH_DISCOUNT: // 打 8折
			cs = new CashDiscount(0.8);
			break;
		case CASH_RETURN: // 满 300返 100
			cs = new CashReturn(300,100);
		break;
		}
	}
	public double GetResult(double money) {
		return cs.acceptCash(money); 
	}
}

最后 测试一下

public class Strategy {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		CashContext cashcontext1 = new CashContext(TYPE.NORMAL); 
		System.out.println("1000元的商品正常收费");
		System.out.println("收费了:¥"+cashcontext1.GetResult(1000)); 
		System.out.println("1000元的商品打8折");
		CashContext cashcontext2 = new CashContext(TYPE.CASH_DISCOUNT);
		System.out.println("收费了:¥"+cashcontext2.GetResult(1000)); 
		System.out.println("1000元的商品满300返100");
		CashContext cashcontext3 = new CashContext(TYPE.CASH_RETURN);
		System.out.println("收费了:¥"+cashcontext3.GetResult(1000)); 
	}

}

运行结果:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值