`
ol_beta
  • 浏览: 283741 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

策略模式之商场促销

阅读更多

每到5.1 10.1等节日,都会看到商场里人山人海。商场之所以如此吸引人,是因为疯狂的折扣。

下面以商场打折为例,谈谈策略模式。

商品的折扣算法:

算法一:对于有的商品,没有折扣。

算法二:对于有的商品,采取固定金额的折扣。

算法三:对于有的商品,采取百分比的折扣。

解决方案:

方案一:将所有的业务逻辑放在客户端。客户端根据参数选择具体的算法,但是这样客户端会变得复杂而且难以维护。

方案二:客户端利用不同层次的继承在子类中实现不同的行为。但这样使算法跟客户端紧密耦合在一起。

方案三:策略模式。把策略算法和客户端分隔开。这样都新的打折算法也不必修改客户端。

模式的实现:

类图:


抽象折扣类:


抽象折扣类代码:

package oliver.designpattern.strategy;
abstract public class DiscountStrategy
{
	/**
	 * 商品单价。
	 */
	protected double price=0.0d;
	
	/**
	 * 商品数量。
	 */
	protected int copies=0;
	
	/**
	 * <b>构造方法。</b>  
	 * <p><b>详细说明:</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 无。
	 * @param price
	 * @param copies
	 */
	public DiscountStrategy(double price,int copies)
	{
		this.price=price;
		this.copies=copies;
	}
	
	/**
	 * <b>折扣计算。</b>  
	 * <p><b>详细说明:</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 无。
	 * @return
	 */
	public abstract double calculateDiscount();
	public double getPrice()
	{
		return price;
	}
	public void setPrice(double price)
	{
		this.price = price;
	}
	public int getCopies()
	{
		return copies;
	}
	public void setCopies(int copies)
	{
		this.copies = copies;
	}
}
 

无折扣策略类:


无折扣策略类代码:

package oliver.designpattern.strategy;
/**
 * <b>无折扣策略。</b>
 * <p><b>详细说明:</b></p>
 * <!-- 在此添加详细说明 -->
 * 无。
 * <p><b>修改列表:</b></p>
 * <table width="100%" cellSpacing=1 cellPadding=3 border=1>
 * <tr bgcolor="#CCCCFF"><td>序号</td><td>作者</td><td>修改日期</td><td>修改内容</td></tr>
 * <!-- 在此添加修改列表,参考第一行内容 -->
 * <tr><td>1</td><td>Oliver</td><td>May 13, 2010 10:02:35 AM</td><td>建立类型</td></tr>
 * 
 * </table>
 * @version 1.0
 * @author Oliver
 * @since 1.0
 */
public class NoDiscountStrategy extends DiscountStrategy
{
	/**
	 * <b>构造方法。</b>  
	 * <p><b>详细说明:</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 无。
	 * @param price
	 * @param copies
	 */
	public NoDiscountStrategy(double price, int copies)
	{
		super(price, copies);
	}
	/** 
	 * <b>calculateDiscount。</b>  
	 * @see oliver.designpattern.strategy.DiscountStrategy#calculateDiscount()
	 */
	@Override
	public double calculateDiscount()
	{
		return 0;
	}
}
 

固定折扣策略类:


固定折扣策略类代码:

package oliver.designpattern.strategy;
/**
 * <b>固定折扣策略。</b>
 * <p><b>详细说明:</b></p>
 * <!-- 在此添加详细说明 -->
 * 无。
 * <p><b>修改列表:</b></p>
 * <table width="100%" cellSpacing=1 cellPadding=3 border=1>
 * <tr bgcolor="#CCCCFF"><td>序号</td><td>作者</td><td>修改日期</td><td>修改内容</td></tr>
 * <!-- 在此添加修改列表,参考第一行内容 -->
 * <tr><td>1</td><td>Oliver</td><td>May 13, 2010 10:05:14 AM</td><td>建立类型</td></tr>
 * 
 * </table>
 * @version 1.0
 * @author Oliver
 * @since 1.0
 */
public class FlatRateStrategy extends DiscountStrategy
{
	/**
	 * 固定折扣价格。
	 */
	private double amount;
	/**
	 * <b>构造方法。</b>  
	 * <p><b>详细说明:</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 无。
	 * @param price
	 * @param copies
	 * @param amount
	 */
	public FlatRateStrategy(double price, int copies,double amount)
	{
		super(price, copies);
		this.amount=amount;
	}
	/** 
	 * <b>calculateDiscount。</b>  
	 * @see oliver.designpattern.strategy.DiscountStrategy#calculateDiscount()
	 */
	@Override
	public double calculateDiscount()
	{
		return amount*copies;
	}
	public double getAmount()
	{
		return amount;
	}
	public void setAmount(double amount)
	{
		this.amount = amount;
	}
}
 

百分比折扣策略类:


百分比折扣策略代码:

package oliver.designpattern.strategy;
/**
 * <b>百分比打折策略。</b>
 * <p><b>详细说明:</b></p>
 * <!-- 在此添加详细说明 -->
 * 无。
 * <p><b>修改列表:</b></p>
 * <table width="100%" cellSpacing=1 cellPadding=3 border=1>
 * <tr bgcolor="#CCCCFF"><td>序号</td><td>作者</td><td>修改日期</td><td>修改内容</td></tr>
 * <!-- 在此添加修改列表,参考第一行内容 -->
 * <tr><td>1</td><td>Oliver</td><td>May 13, 2010 10:10:42 AM</td><td>建立类型</td></tr>
 * 
 * </table>
 * @version 1.0
 * @author Oliver
 * @since 1.0
 */
public class PercentageStrategy extends DiscountStrategy
{
	/**
	 * 打折百分比。
	 */
	private double percent;
	/**
	 * <b>构造方法。</b>  
	 * <p><b>详细说明:</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 无。
	 * @param price
	 * @param copies
	 * @param percent
	 */
	public PercentageStrategy(double price, int copies,double percent)
	{
		super(price, copies);
		this.percent=percent;
	}
	/** 
	 * <b>calculateDiscount。</b>  
	 * @see oliver.designpattern.strategy.DiscountStrategy#calculateDiscount()
	 */
	@Override
	public double calculateDiscount()
	{
		return price*copies*percent;
	}
	public double getPercent()
	{
		return percent;
	}
	public void setPercent(double percent)
	{
		this.percent = percent;
	}
}
 

测试代码:

商品类——图书:

package oliver.designpattern.strategy.product;
import oliver.designpattern.strategy.DiscountStrategy;
/**
 * <b>Books。</b>
 * <p><b>详细说明:</b></p>
 * <!-- 在此添加详细说明 -->
 * 无。
 * <p><b>修改列表:</b></p>
 * <table width="100%" cellSpacing=1 cellPadding=3 border=1>
 * <tr bgcolor="#CCCCFF"><td>序号</td><td>作者</td><td>修改日期</td><td>修改内容</td></tr>
 * <!-- 在此添加修改列表,参考第一行内容 -->
 * <tr><td>1</td><td>Oliver</td><td>May 13, 2010 10:15:30 AM</td><td>建立类型</td></tr>
 * 
 * </table>
 * @version 1.0
 * @author Oliver
 * @since 1.0
 */
public class Book
{
	/**
	 * 打折策略。
	 */
	private DiscountStrategy discountStrategy;
	public DiscountStrategy getDiscountStrategy()
	{
		return discountStrategy;
	}
	public void setDiscountStrategy(DiscountStrategy discountStrategy)
	{
		this.discountStrategy = discountStrategy;
	}
}
 

商品类——水果:

package oliver.designpattern.strategy.product;
import oliver.designpattern.strategy.DiscountStrategy;
/**
 * <b>Fruits。</b>
 * <p><b>详细说明:</b></p>
 * <!-- 在此添加详细说明 -->
 * 无。
 * <p><b>修改列表:</b></p>
 * <table width="100%" cellSpacing=1 cellPadding=3 border=1>
 * <tr bgcolor="#CCCCFF"><td>序号</td><td>作者</td><td>修改日期</td><td>修改内容</td></tr>
 * <!-- 在此添加修改列表,参考第一行内容 -->
 * <tr><td>1</td><td>Oliver</td><td>May 13, 2010 10:17:13 AM</td><td>建立类型</td></tr>
 * 
 * </table>
 * @version 1.0
 * @author Oliver
 * @since 1.0
 */
public class Fruit
{
	/**
	 * 打折策略。
	 */
	private DiscountStrategy discountStrategy;
	public DiscountStrategy getDiscountStrategy()
	{
		return discountStrategy;
	}
	public void setDiscountStrategy(DiscountStrategy discountStrategy)
	{
		this.discountStrategy = discountStrategy;
	}
}
 

商品类——玩具:

package oliver.designpattern.strategy.product;
import oliver.designpattern.strategy.DiscountStrategy;
/**
 * <b>Toy。</b>
 * <p><b>详细说明:</b></p>
 * <!-- 在此添加详细说明 -->
 * 无。
 * <p><b>修改列表:</b></p>
 * <table width="100%" cellSpacing=1 cellPadding=3 border=1>
 * <tr bgcolor="#CCCCFF"><td>序号</td><td>作者</td><td>修改日期</td><td>修改内容</td></tr>
 * <!-- 在此添加修改列表,参考第一行内容 -->
 * <tr><td>1</td><td>Oliver</td><td>May 13, 2010 10:22:24 AM</td><td>建立类型</td></tr>
 * 
 * </table>
 * @version 1.0
 * @author Oliver
 * @since 1.0
 */
public class Toy
{
	/**
	 * 打折策略。
	 */
	private DiscountStrategy discountStrategy;
	public DiscountStrategy getDiscountStrategy()
	{
		return discountStrategy;
	}
	public void setDiscountStrategy(DiscountStrategy discountStrategy)
	{
		this.discountStrategy = discountStrategy;
	}
}
 

主类:

package oliver.designpattern.strategy.test;
import oliver.designpattern.strategy.FlatRateStrategy;
import oliver.designpattern.strategy.NoDiscountStrategy;
import oliver.designpattern.strategy.PercentageStrategy;
import oliver.designpattern.strategy.product.Book;
import oliver.designpattern.strategy.product.Fruit;
import oliver.designpattern.strategy.product.Toy;
public class SuperMarket
{
	public static void main(String[] args)
	{
		
		Book englishBook = new Book();
		englishBook.setDiscountStrategy(new PercentageStrategy(20.0d,5,0.2));
		Fruit apple = new Fruit();
		apple.setDiscountStrategy(new FlatRateStrategy(1.3,30,0.1));
		Toy car = new Toy();
		car.setDiscountStrategy(new NoDiscountStrategy(50.0,1));
		
		System.out.println("EnglishBoos Discount:"+englishBook.getDiscountStrategy().calculateDiscount()); 
		System.out.println("Apple Discount:"+apple.getDiscountStrategy().calculateDiscount());
		System.out.println("Toy Car Discount:"+car.getDiscountStrategy().calculateDiscount());
		
	}
}
 

策略模式的使用情况:

(1) 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

(2) 一个系统需要动态地在集中算法中选择一种。那么这些算法可以包装到一个个的具体算法里面,而这些具体算法都都是一个抽象算法类的子类。

(3) 一个系统的算法使用的数据不可以上客户端知道,策略模式可以避免让客户端涉及到不必要接触的复杂的和只与算法有关的数据。

(4) 如果一个对象有很多的行为,如果不使用恰当的模式,这些行为只好使用多重的条件选择语句来实现。此时,使用侧路模式,把这些行为转移到相应的具体策略类里面,就可以避免使用难以维护的多重条件选择语句,并体现面向对象的设计概念。

策略模式的优点:

(1) 提供了管理相关算法足的办法。

(2) 避免了难以维护的多重条件选择语句的使用。

(3) 提供了可以代替继承关系的办法。

策略模式的缺点:

(1) 客户端必须提前知道所有的策略类,并且自己决定使用那一个策略类。

(2) 策略模式造成很多的策略类。

另外在java语言内部也有好多策略模式的例子:如comparator,AWT中的LayoutManager,Swing中的Border等。有兴趣的可以研究研究。

工程实例下载:http://cid-2c8a0dc7c1eb1d71.skydrive.live.com/self.aspx/soft/Design%20Pattern/Strategy.7z

  • 大小: 71.4 KB
  • 大小: 19.9 KB
  • 大小: 10.2 KB
  • 大小: 15.6 KB
  • 大小: 15.5 KB
分享到:
评论

相关推荐

    Java使用策略模式解决商场促销商品问题示例

    主要介绍了Java使用策略模式解决商场促销商品问题,简单描述了策略模式的概念、原理,并结合实例形式分析了Java基于策略模式解决商品促销问题的相关操作技巧,需要的朋友可以参考下

    策略模式--商场促销_设计模式.rar

    面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和...策略模式:它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户

    java设计模式-策略模式

    此代码简单的模拟了超市的促销策略,有打折、返钱等操作!针对商场中出现的各种各样的促销策略,很方便的便可实现策略的拓展!

    O2O模式下的零售商双渠道促销策略研究

    O2O模式下的零售商双渠道促销策略研究,马云峰,粟晨静,区别于传统的渠道价格竞争模式,O2O(Online to Offline)模式下的零售商往往采取的是双渠道同价模式。因此,线上线下的联合促销策略成为�

    设计模式一(单子、工厂、策略模式)练习 .zip

    设计模式一(单子、工厂、策略模式)练习 1. 假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。对所有的教材类图书 实行每本一元的折扣;对连环画类图书提供每本 7%的促销折扣;而对非教材类的计算 机...

    商贸零售行业月度投资策略:双十一促销提振社零增速,新消费模式带动增长.pdf

    商贸零售行业月度投资策略:双十一促销提振社零增速,新消费模式带动增长.pdf

    C#策略模式典型演示程序源代码

    摘要:C#源码,菜单窗体,策略模式,设计模式 商场促销-策略模式-大话设计模式,策略模式典型演示程序C#源代码,演示程序很好的解释了策略模式的编程模板。源码中包括:现金收费抽象类(现金收取超类的抽象方法,收取...

    基于现有在线旅游市场分析的新型旅游APP营销策略.pdf

    携程是传统旅游在线服务市场的巨头之一,是典型的综合OTA。其主要经营业务包括酒店预订、机票预订等在线预订服务,还有旅游度假、商旅管理、特惠商户、旅游资讯以及代驾租车等旅游上下游的周边服务口。携程网具有...

    北邮Java大作业低配版

    设计模式一(单子、工厂、策略模式)练习 1. 假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。对所有的教材类图书 实行每本一元的折扣;对连环画类图书提供每本7%的促销折扣;而对非教材类的计算机图书...

    软件产品的营销策略.docx

    软件产品的营销策略.docx

    Java策略模式实现简单购物车功能

    主要介绍了Java策略模式实现简单地购物车,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    北邮java选修大作业 购物车

    大作业设计模式一(单子、工厂、策略模式)练习 假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。对所有的教材类图书 实行每本一元的折扣;对连环画类图书提供每本7%的促销折扣;而对非教材类的计算机...

    自有仓模式基础上进行电商订单集中处理系统.docx

    促销规则管理和促销活动管理是促销策略管理模块实现的功能;库存管理中实现对销售库存管理、库存调整等功能;日志报表模块中实现的功能有单据日志管理、统计报表管理等。 系统应用后起到优化青时服装集团的电商经营...

    校园购物网的营销策略探讨.doc

    4.3 促销策略 20 4.4 渠道策略 21 5结论和建议 22 5.1结论 22 5.2建议 22 致 谢 23 参考文献 24 1 绪论 1.1研究的背景 电子商务作为一种新兴的商务模式,为世界经济打开了一个新的市场,人类的生活方式也由此而发生...

    论文研究-考虑电商平台信用支付促销的供应链协调研究.pdf

    考虑到我国越来越多的电商平台为消费者提供基于互联网的信用支付策略作为重要的促销手段,构建了二级供应链中促销努力水平影响消费者需求的函数,研究其定价和促销努力水平协调问题。利用Stackelberg博弈分析供应链...

    考虫网课营销策略分析.doc

    4P营销理念包括产品策略、价格策略、促销策略和渠道策略四个方面。根据这个理念,我们对考虫网课营销策略进行了分析,发现了存在的一些问题。 首先,考虫网课的营销策略存在传播渠道狭窄的问题。传播渠道狭窄会限制...

    零售管理培训教材-KA重点零售客户管理模式(PPT 23页).ppt

    本资源是零售管理培训教材,主要介绍了零售管理的基本概念、零售客户管理模式、零售客户经理角色与职责、零售产品管理、零售客户店内形象管理、零售促销管理等知识点。通过本资源,可以了解零售管理的重要性、零售...

    北邮java李劼java大作业,设计模式二

    1. 假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。对所有的教材类图书 实行每本一元的折扣;对连环画类图书提供每本7%的促销折扣;...使用策略模式、工厂模式、单子模式进行设计,类图如下。

Global site tag (gtag.js) - Google Analytics