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