初探开发者模式——Strategy模式(策略者模式)

在生活当中,有一些情况是只能在多种可能选择下只能有一中情况发生。比如说是在某一个商城的打折,在做种打折策略情况下,商城只允许只用其中一种打折策略,这时候尅考虑使用策略者模式。这跟装饰这模式有点儿区别,装饰者模式可以同时享受多重打折策略。而策略者只能只用一种。

 装饰者模式与策略者模式有点儿相同但也有区别:两者都是将主要的方法抽象出来做接口,再让具体的子类去实现,不同的是,策略者模式对一个工厂,在工厂里面决定使用的是哪个具体的方法。

下面使用商城打折例子简要说明一下:

package com.usc.lilin.GoodsOnSale_Strategy;

import java.util.Date;

/**
 * 商品打折
 * 每次只能享受一种打折优惠
 * 即使用策略者模式
 * @author gaosi
 *
 */
public class MainTest {

	/**
	 * 程序的入口
	 * @param args
	 */
	public static void main(String[] args) {
		
		//初始化商品仓库 仓库暂设两样商品
		GoodsWareHouse gwh = new GoodsWareHouse();
		
		gwh.addGoods(new Goods("牛奶", 45.0));
		gwh.addGoods(new Goods("棉被", 350.0));
		
		//获取时间
		Date date = new Date();
		int hours = date.getHours();
		
		if(hours<24&&hours>22){ //时间在22 --24时 即在政府补贴的时间段
			//暂以去仓库的序列号的商品
			Goods goods = gwh.getGoods(0);
			System.out.println("商品:"+goods.name+"   原价:"+goods.price);
			StrategyFactory sf = new StrategyFactory(2,goods.price);
			sf.showMSG();
		}
		
		//暂以商家的打折优惠这为例
		Goods goods = gwh.getGoods(1);
		System.out.println("商品:"+goods.name+"   原价:"+goods.price);
		StrategyFactory sf = new StrategyFactory(3,goods.price);
		sf.showMSG();
		
	}

}
package com.usc.lilin.GoodsOnSale_Strategy;

/**
 * 打折的超类
 * @author gaosi
 *
 */
public interface IDiscountStrategy {
	/**、
	 * 享受到的打折的情况 
	 * @return 享受到的打折
	 */
	public String st();
	
	/**
	 * 返回折后价
	 * @return 折后价
	 */
	public double price();

}
package com.usc.lilin.GoodsOnSale_Strategy;
/**
 * 商品类
 * 商品的基本属性:价格(原价),商品名
 * @author gaosi
 *
 */
public class Goods {
	/**商品的价格*/
	public double price;
	/**商品的名字*/
	public String name;
	
	/**
	 * 商品的构造方法
	 * @param name  名字
	 * @param price 价格
	 */
	public Goods(String name,double price) {
		this.price = price;
		this.name = name;
	}
	
	//提供的可根据需要可对商品的基本实行进行更改的方法
	
	/**
	 * 获取商品的价格
	 * @return 价格
	 */
	public double getPrice() {
		return price;
	}

	/**
	 * 改变商品的价格
	 * @param price 价格
	 */
	public void setPrice(double price) {
		this.price = price;
	}

	/**
	 * 获取商品的名字
	 * @return 商品的名字
	 */
	public String getName() {
		return name;
	}

	/**
	 * 重新设置商品的名字
	 * @param name
	 */
	public void setName(String name) {
		this.name = name;
	}
	
	

}
package com.usc.lilin.GoodsOnSale_Strategy;

import java.util.ArrayList;
import java.util.List;

/**
 * 商品的仓库
 * 用list队列存储来冲当仓库
 * @author gaosi
 *
 */
public class GoodsWareHouse {
	/** 仓库队列	 */
	public List<Goods> list = new ArrayList<>();
	
	/**
	 * 仓库进仓的方法
	 * @param goods 进仓的商品
	 */
	public void addGoods(Goods goods) {
		list.add(goods);
	}
	
	/**
	 * 商品出库的方法
	 * @param goods 出库的商品
	 */
	public Goods getGoods(int i){
		return list.remove(i);
	}

}
package com.usc.lilin.GoodsOnSale_Strategy;

/**
 * 打折的超类
 * @author gaosi
 *
 */
public interface IDiscountStrategy {
	/**、
	 * 享受到的打折的情况 
	 * @return 享受到的打折
	 */
	public String st();
	
	/**
	 * 返回折后价
	 * @return 折后价
	 */
	public double price();

}
package com.usc.lilin.GoodsOnSale_Strategy;

/**
 * 政府的时间段补贴
 * 在22:00 -- 23:59时段享受95折优惠
 * @author gaosi
 *
 */
public class GovernmentDecorator implements IDiscountStrategy {

	private double price;
	/**
	 * 构造函数
	 * 接收商品的原价
	 * @param price 商品的原价
	 */
	public GovernmentDecorator(double price) {
		this.price = price;
	}
	
	@Override
	/**
	 * 返回受到打折的优惠
	 */
	public String st() {
		// TODO Auto-generated method stub
		return "政府的时间段补贴";
	}

	/**
	 * 返回折后价 95折
	 */
	@Override
	public double price() {
		// TODO Auto-generated method stub
		return 0.95*price;
	}

}
package com.usc.lilin.GoodsOnSale_Strategy;

/**
 * 商家的打折优惠类
 * @author gaosi
 *
 */
public class SellerDecorator implements IDiscountStrategy {
	
	private double price;
	
	public SellerDecorator(double price) {
		this.price = price;
	}


	/**
	 * 返回受到的打折的情况
	 */
	@Override
	public String st() {
		return "商家的打折优惠";
	}

	/**
	 * 返回折后价
	 *  9 折
	 */
	@Override
	public double price() {
		return 0.9*price;
	}

}
package com.usc.lilin.GoodsOnSale_Strategy;

/**
 * 网站 商家的优惠
 *  每满一百减10
 * @author gaosi
 *
 */
public class SiteDecorator implements IDiscountStrategy{
	
	private double price;
	/**
	 * 构造函数加收商品的原价
	 * @param price
	 */
	public SiteDecorator(double price) {
		this.price = price;
	}

	@Override
	/**
	 * 返回顾客收到的优惠
	 */
	public String st() {
		// TODO Auto-generated method stub
		return "网店,商家的优惠";
	}

	/**
	 * 返回商品的折后价
	 * 每满一百减10
	 */
	@Override
	public double price() {
		//将price/100强转为int型,避免出现不足一百的也有优惠的误差
		return price-((int)price/100)*10;
	}

}
package com.usc.lilin.GoodsOnSale_Strategy;

/**
 * 打折工厂
 * 参数 i 来选择打折方式:1为原价,2 为政府时间段的补贴
 *  3 为商家的9折优惠 ,4为网店等商家的满一百减10 的优惠
 *  其余其情况为原价
 * @author gaosi
 *
 */
public class StrategyFactory {
	
	private IDiscountStrategy ids;

	/**
	 * 打折工厂的打折算法选择
	 * @param i 选择打折算法的参数
	 * @param price 商品的原价
	 */
	public StrategyFactory(int i,double price) {
		

		switch (i) {
		case 1://原价
			ids = new DefultDecorator(price);
			break;
		case 2://政府补贴优惠方式
			 ids = new GovernmentDecorator(price);
			 break;
		case 3://为商家的9折优惠
			ids = new SellerDecorator(price);
			break;
		case 4://为网店等商家的满一百减10 的优惠
			ids = new SiteDecorator(price);
			break;
		default: //其余情况 原价
			ids = new DefultDecorator(price);
			break;
		}
	
	}
	
	
	public void showMSG() {
		String  st = ids.st();
		double price = ids.price();
		
		System.out.println("受到的优惠方式:"+st);
		System.out.println("折后价"+price);
	}

}

猜你喜欢

转载自gaosililin.iteye.com/blog/2206894
今日推荐