Strategy学习笔记

首先看一下策略模式的UML图


Strategy通常是一个接口,其中定义抽象的算法接口,具体实现具体策略子类(ConcreteStrategy)来实现。

Context定义了对策略类的算法方法的调用以完成具体的逻辑,Context对Strategy类的调用不管是如何实现的,只要可以完成功能即可。

ConcreteStrategy完成策略接口中定义的方法,不同的实现子类对Strategy抽象层的实现也不相同。


一个简单的例子,一个商场中可以有不同的购物区,每个区域在不同的时节和情况下会有相应的折扣

首先建立一个抽象Market类包含购物区的一些基本属性和方法

package com.akwolf.strategymarket;

public abstract class Market {
	protected Onsale onsale;

	public Market() {
		// 默认无折扣
		onsale = new OnsaleNone();
	}

	/**
	 * 各个商场用来结算最终金额的方法
	 * 
	 * @param price 商品总价
	 * @return
	 */
	public abstract float calculatePrice(float price);

	public Onsale getOnsale() {
		return onsale;
	}

	public void setOnsale(Onsale onsale) {
		this.onsale = onsale;
	}
}

让不同的购物区实现Market以实现一个简单的从原始价得到打折后价格的功能

package com.akwolf.strategymarket;

public class ClothesMarket extends Market {
	@Override
	public float calculatePrice(float price) {
		return onsale.saleRate() * price;
	}
}

FoodMarket:

package com.akwolf.strategymarket;

public class FoodMarket extends Market {
	@Override
	public float calculatePrice(float price) {
		return price * onsale.saleRate();
	}
}


建立打折的接口(Onsale)相当于Stratety接口,供不同的打折类型拓展,因为打折的类型可能很多,也具有不确定性

package com.akwolf.strategymarket;

public interface Onsale {

	public float saleRate();
}

剩下就是让不同的打折类型拓展自打折接口,以便在不同的购物区被使用

package com.akwolf.strategymarket;

/**
 * 秋季打折
 * 
 * @author zhanghua
 * 
 */
public class OnsaleAutumn implements Onsale {
	@Override
	public float saleRate() {
		return 0.88f;
	}
}
package com.akwolf.strategymarket;

/**
 * 春节打折
 * 
 * @author zhanghua
 * 
 */
public class OnsaleSpring implements Onsale {
	@Override
	public float saleRate() {
		return 0.5f;
	}
}

建立一个类测试一些运行效果

package com.akwolf.strategymarket;

public class MainTest {
	public static void main(String[] args) {
		Market market ;
		Onsale onsale ;
		
		//秋天了收获的季节,食物和衣服都打折
		onsale = new OnsaleAutumn() ;
		market = new ClothesMarket() ;
		//买了一件衣服得到打折后的价格
		market.setOnsale(onsale) ;
		System.out.println(market.calculatePrice(50)); 
		//在食品区买了150元的食品得到打折后的价格
		market = new FoodMarket() ;
		market.setOnsale(onsale) ;
		System.out.println(market.calculatePrice(150));
		
		System.out.println("---------------");
		//春节在食品区买东西享受春节优惠,
		onsale = new OnsaleSpring() ;
		market = new FoodMarket() ;
		market.setOnsale(onsale) ;
		System.out.println(market.calculatePrice(300));
		//衣服不打折了
		market = new ClothesMarket() ;
		System.out.println(market.calculatePrice(200));
		
	}

}

源码已经上传,有需要的童鞋可以看一下http://download.youkuaiyun.com/source/3571017


初次发表文章,难免有的地方说的不够通顺和一些对策略模式认识不够透彻的地方,欢迎各位拍砖一起讨论学习,共同进步!!!



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值