设计模式之策略模式

策略模式:“策略”二字等同于算法,当现实系统中需要对算法动态指定,并且可以互相替换,可以抽象出算法的调用接口,具体的算法实现由具体的策略角色去实现,根据里氏替换原则,任何出现父类的地方都可以使用它的子类去替换,这样符合我们的业务需求。

 

案例描述:某家超市国庆节为了促销,某些类商品打折,比如运动鞋打8折、秋装打9折等,张三去购物为了一双运动鞋、一件秋装、一瓶洗发水。。。,张三买完东西回家,心想今天自己总共“赚”了多少钱? 

案例分析:商家对于商品打折可能有很多策略,这里使用策略模式,封装商品打折策略,这样以便以后扩展了打折策略,不用去修改原来的代码,具有很好的灵活性。

模式涉及的角色: 

抽象策略角色:通常由一个接口或者抽象实现;

具体策略角色:包装了相关的算法和行为;

环境角色:包含抽象策略角色的引用,最终供用户使用。

工程结构:

 

 

(1)创建一个Discountable接口,使得每个实现这个接口的类都能够打折

package com.alan.tragedy.goods;

public interface Discountable {
	double getNewPrice() ;
}


(2)创建商品类Goods

package com.alan.tragedy.goods;

import com.alan.tragedy.goods.utl.Discountor;

public class Goods implements Discountable {

	// 商品的类型
	private String type;
	// 商品的名字
	private String name;
	// 商品的价格
	private double price;
	// 打折策略
	private Discountor goodsDiscountor;

	public Goods(String type, String name, double price) {
		this.type = type;
		this.name = name;
		this.price = price;
	}

	@Override
	public String toString(){
		return "商品类型:"+type+" | 名字:"+name+" | 原始价格"+price+" | 打折后的价格:"+getNewPrice() ;
	}

	@Override
	public double getNewPrice() {
		// TODO Auto-generated method stub
		double newPrice = price ;
		if(goodsDiscountor !=null){
			//根据实现的打折策略来得到打折后的价格
			newPrice = goodsDiscountor.getNewPrice(newPrice) ;
		}
		return newPrice ;
	}

	public Discountor getGoodsDiscountor() {
		return goodsDiscountor;
	}

	public void setGoodsDiscountor(Discountor goodsDiscountor) {
		this.goodsDiscountor = goodsDiscountor;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}

}

(3)创建打折策略的接口Discountor

package com.alan.tragedy.goods.utl;

public interface Discountor {
	//根据原先的价格来取得折扣后的价格
	double getNewPrice(double oldPrice) ;
}

(4)创建打折策略接口的实现类,这边我们简单根据季节来对某个商品来实现不同的打折策略

(4.1)春季的商品打折策略

package com.alan.tragedy.goods;

import com.alan.tragedy.goods.utl.Discountor;

public class SpringDiscountImpl implements Discountor{

	//夏季商品的打9折
	@Override
	public double getNewPrice(double oldPrice) {
		return oldPrice * 0.9;
	}

}

(4.2)秋季的商品打折策略

package com.alan.tragedy.goods;

import com.alan.tragedy.goods.utl.Discountor;

public class AutomDiscountor implements Discountor{

	@Override
	public double getNewPrice(double oldPrice) {
		//秋季打68折
		return oldPrice * 0.68;
	}

}

(5)创建一个测试类

package com.alan.tragedy.goods;

public class Client {
	public static void main(String[] args) {
		//创建一个商品:type:衣服,name:上衣,price:235.0¥
		Goods goods = new Goods("衣服","上衣",235.0) ; 
		//春季打折策略
		goods.setGoodsDiscountor(new SpringDiscountImpl()) ;
		System.out.println("春季---〉"+goods);
		//秋季打折策略
		goods.setGoodsDiscountor(new AutomDiscountor()) ;
		System.out.println("秋季---〉"+goods);
	}
}

输出的结果:

春季---〉商品类型:衣服 | 名字:上衣 | 原始价格235.0 | 打折后的价格:211.5
秋季---〉商品类型:衣服 | 名字:上衣 | 原始价格235.0 | 打折后的价格:159.8







 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值