在生活当中,有一些情况是只能在多种可能选择下只能有一中情况发生。比如说是在某一个商城的打折,在做种打折策略情况下,商城只允许只用其中一种打折策略,这时候尅考虑使用策略者模式。这跟装饰这模式有点儿区别,装饰者模式可以同时享受多重打折策略。而策略者只能只用一种。
装饰者模式与策略者模式有点儿相同但也有区别:两者都是将主要的方法抽象出来做接口,再让具体的子类去实现,不同的是,策略者模式对一个工厂,在工厂里面决定使用的是哪个具体的方法。
下面使用商城打折例子简要说明一下:
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); } }