`
ol_beta
  • 浏览: 289096 次
  • 性别: 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使用策略模式解决商场促销商品问题示例 策略模式是软件设计模式中的一种行为型模式,用于定义一系列的算法,将每一种算法封装起来,并可以相互替换使用。策略模式让算法独立于使用它的客户应用而独立变化。 在...

    策略模式之商场收银软件

    在商场收银软件的场景中,策略模式可以用来处理各种不同的促销策略,如满减、折扣、买一赠一等,使得软件更具灵活性和扩展性。相较于简单工厂模式,策略模式更强调行为的选择而非对象的创建。 在C++中实现策略模式...

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

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

    java设计模式-策略模式

    在这个“java设计模式-策略模式”的示例中,我们将深入探讨如何使用策略模式来实现一个简单的超市促销系统。 策略模式的核心思想是定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换。这使得算法的...

    策略模式demo例子

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,有时我们需要根据不同的场景或条件选择不同的算法或行为。策略模式允许我们将这些算法封装成独立的类,然后在运行时根据需求选择合适的...

    设计模式之策略模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。...通过使用策略模式,商场收银软件能够以更加灵活和可维护的方式应对不断变化的促销策略,体现了面向对象设计的核心思想:封装、继承和多态。

    基于springboot+策略模式 实现简单促销

    基于springboot+策略模式 实现简单促销 //加法 BigDecimal result1 = num1.add(num2); //减法 BigDecimal result2 = num1.subtract(num2); //乘法 BigDecimal result3 = num1.multiply(num2); //除法 ...

    设计模式之策略模式源码(C#+.NET6)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在C#与.NET6框架下,策略模式的应用能够帮助我们实现代码的灵活性和可扩展性。下面将详细讲解策略模式的核心概念、实现方式以及如何在实际项目中应用...

    简单工厂模式、代理模式、策略模式如此相似

    在软件设计模式的世界里,"简单工厂模式"、"代理模式"和"策略模式"都是经典的设计模式,它们各自有着独特的应用场景和优缺点。本文将深入解析这三种模式的原理和区别,帮助读者理解它们在实际开发中的运用。 首先,...

    C#設計模式之策略模式

    ### C#设计模式之策略模式详解 在软件工程与编程领域,设计模式被视为解决常见问题的模板或指导原则,能够帮助开发者以一种可复用的方式解决问题。其中,“策略模式”是一种行为型设计模式,它允许在运行时选择算法...

    02策略模式.zip

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,有时我们需要根据不同的...在商场管理软件的场景中,策略模式使得添加新的促销策略变得简单,只需新增一个策略类即可,无需改动其他代码。

    02_StrategyPattern 商场促销

    《商场促销:深入理解策略模式》 在软件设计中,策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在这个例子中,我们关注的是商场促销活动,这是一个经常需要根据具体情况调整策略的场景。策略模式...

    设计模式系列之策略模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或场景来执行不同算法的情况。策略模式就是为了处理这种问题而诞生的,它允许我们在不修改原有代码的...

    C#简单三层,策略模式,反射,实现低耦合

    综上所述,这个项目通过C#语言实现了商场管理软件,利用策略模式处理不同的促销策略,通过反射实现动态策略选择,以降低耦合度,提高软件的可维护性和可扩展性。通过这样的设计,软件能够适应不断变化的商业需求,...

    设计模式——策略模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或策略来执行不同操作的情况。策略模式允许我们将算法封装到独立的可互换的策略对象中,从而使算法的...

    [行为模式] head first 设计模式之策略模式(strategy)

    《行为模式:Head First 设计模式中的策略模式》 策略模式是设计模式中的一种行为模式,它使我们能够在运行时改变对象的行为。在面向对象设计中,策略模式提供了一种方式来封装一系列算法,并使它们可以互相替换,...

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

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

    大话模式源代码-02策略模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或时间点执行不同算法的情况。策略模式允许我们将这些算法封装成独立的类,使得它们可以互换,从而提高...

    策略(strategy)模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。 在策略模式中,我们创建表示各种策略的对象和一个行为根据...

Global site tag (gtag.js) - Google Analytics