在商城系统中使用设计模式----策略模式

1.概念:

 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

2.注意:

主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。

何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。

注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

3.使用场景: 

场景:商城活动中有几种,满减,打折,送积分....

4.实现

1.定义商品价格类

public interface GoodsActivity {

    /**
     * 获取应该支付的金额
     * @param amount 商品的单价
     * @return
     */
    BigDecimal getPayPrice(BigDecimal amount);

}

2.实现接口类

/**
 * 商品折扣活动
 *
 * @author chen
 * @create 2019-04-01 14:44
 **/
public class DiscountActivity implements GoodsActivity {

    //折扣
    private double discount;

    public DiscountActivity(double discount){
        this.discount = discount;
    }

    @Override
    public BigDecimal getPayPrice(BigDecimal amount) {
        return new BigDecimal(discount).multiply(amount).divide(new BigDecimal(10));
    }
}
/**
 * 满减活动
 *
 * @author chen
 * @create 2019-04-01 14:48
 **/
public class FullReduceActivity implements GoodsActivity {

    //满多少
    private BigDecimal fullAmount;

    //减多少
    private BigDecimal reductionAmount;

    public FullReduceActivity(BigDecimal fullAmount,BigDecimal reductionAmount){
        this.fullAmount=fullAmount;
        this.reductionAmount=reductionAmount;
    }

    @Override
    public BigDecimal getPayPrice(BigDecimal amount) {
        return amount.compareTo(fullAmount)>=0?amount.subtract(reductionAmount):amount;
    }
}
/**
 * 积分抵扣
 *
 * @author chen
 * @create 2019-04-01 14:58
 **/
public class IntegralActivity implements GoodsActivity {

    //抵扣的积分  10积分=1元
    private int integral;

    public IntegralActivity(int integral){
        this.integral = integral;
    }

    @Override
    public BigDecimal getPayPrice(BigDecimal amount) {
        return amount.subtract(new BigDecimal(integral/10));
    }
}

3.创建Context

public class GoodsActivityContext {

    private GoodsActivity goodsActivity;

    public GoodsActivityContext(GoodsActivity goodsActivity){
        this.goodsActivity=goodsActivity;
    }

    /**
     * 获取商品价格
     * @param amount
     * @return
     */
    public BigDecimal getPrice(BigDecimal amount){
        return goodsActivity.getPayPrice(amount);
    }
}

5.定义引用入口

public class StrategyMain {

    /**
     *
     * 在商城系统中,经常有不同的活动,每种活动商品的价格计算可能都不一样
     * 比如:会员折扣,满减,积分抵扣.....
     *
     * @param args
     */
    public static void main(String[] args) {

        //商品价格
        BigDecimal amount = new BigDecimal(500);

        //满300-100
        GoodsActivity fullReduceActivity = new FullReduceActivity(new BigDecimal(300),new BigDecimal(100) );
        GoodsActivityContext goodsActivityContext = new GoodsActivityContext(fullReduceActivity);
        System.out.println("满减活动:"+goodsActivityContext.getPrice(amount));

        //折扣活动
        GoodsActivity discountActivity = new DiscountActivity(9);
        goodsActivityContext = new GoodsActivityContext(discountActivity);
        System.out.println("折扣活动:"+goodsActivityContext.getPrice(amount));

        //积分抵扣活动
        GoodsActivity integralActivity = new IntegralActivity(100);
        goodsActivityContext = new GoodsActivityContext(integralActivity);
        System.out.println("积分抵扣活动:"+goodsActivityContext.getPrice(amount));

    }

源码:

https://github.com/littleStone-chan/design-patternsIn-mall/tree/master/strategy

在工作中,不能灵活的时候设计模式。希望通过这次的学习,可以加深对设计模式对理解。

接下来会继续整理出自己在工作对时候可以使用对设计模式,不对望指点。如果文章对您有帮助,github给个start吧。

原文地址:https://www.cnblogs.com/boychen/p/10714192.html

时间: 2024-10-06 22:24:00

在商城系统中使用设计模式----策略模式的相关文章

在商城系统中使用设计模式----策略模式之在spring中使用观察者模式和发布/订阅

1.概念: 观察者模式: 是属于设计者模式中的一种,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知. 发布/订阅: 是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者),而是通过调度器将消息发布给订阅者. 2.区别:下图明显可以看出发布/订阅比观察者模式中多了一层中间信道, 在Observer模式中,O bservers知道Subject,同时Subject还保留了Observers的记录.然而,在发布者/订阅者中,发布者和订阅

转:多篇文章中的设计模式-------策略模式

DRY原则和设计模式 前两天在做统计程序时,需要读取linux中的日志文件,在网上查了下,就有了结论,于是,根据需要,我写下了这样的代码: [java] view plaincopy public class dealFile { public static void dealContent(String[] commands){ BufferedReader reader=null; try{ Process process = Runtime.getRuntime().exec (comma

[工作中的设计模式]策略模式stategy

一.模式解析 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 策略模式的关键点为: 1.多种算法存在 2.算法继承同样的接口,执行同样的行为,为可以替代的 3.算法调用者唯一,算法调用者可以灵活改变自己需要调用的算法,从而实现计算. 二.模式代码 算法接口: /** * 算法统一接口,所有算法继承此接口 * @author zjl * @time 2016-1-24 * */ public interface IStra

ruby中的设计模式--策略模式

模板模式固然不错,但其还是有一些缺陷的.比如其实现依赖于继承并且缺足够的灵活性.在这时候我们就需要找到一个更加优化的解决方案——策略模式. 下面是使用策略模式实现的Report模板 1 # 策略1 2 class HTMLFormatter 3 def output_report title, text 4 puts '<html>' 5 puts ' <head>' 6 puts ' <title>' + title + '</title>' 7 puts

2.大话设计模式-策略模式

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace DesignModel 8 { 9 /// <summary> 10 /// 策略模式 11 /// </summary> 12 public class TacticsModel 13 { 14 //对于

设计模式—策略模式

什么是策略模式? 策略模式定义了算法家族,分别封装起来,让它们之间能够相互替换,此模式让算法的变化不会影响到使用算法 的客户. 策略模式是一种定义一系列算法的方法,从概念上看全部这些算法完毕的都是同样的工作,仅仅是实现不同,它可 以以同样的方式调用全部的算法,降低了各种算法类与使用算法之间的耦合. 策略模式的长处? (1)策略模式的Strategy类层为Context类定义了一系列的可供重用的算法和行为.继承有助于析取出这些算法 的公共功能. (2)简化了单元測试(每一个算法都有自己的类,能够通

JavaScript设计模式 策略模式

在现实中,我们到达一个地方,通常可以选择不同的方式,例如自行车,火车,汽车,飞机等. 在程序设计中,通常也会有这样的情况,实现一个功能有多个方案可以选择,比如一个压缩文件的程序,既可以选择zip算法,也可以选择gzip算法. 而这种情况,在设计模式中,称为策略模式. 策略模式的定义:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换. 例子: 很多公司的年终奖是根据员工的工资基数和年底绩效情况来方法的.如S级绩效为4倍工资,A级有3倍工资,B级有两倍工资. 在不使用策略模式的情况下,

设计模式之禅之设计模式-策略模式

一:策略模式的定义        --->是一种比较简单的模式,也叫做政策模式        --->定义一组算法,将每个算法都封装起来,并且使它们之间可以互换 二:策略模式的三个角色 ● Context封装角色        --->它也叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略.算法的直接访问,封装可能存在的变化.● Strategy抽象策略角色        --->策略.算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性● ConcreteStr

head first 设计模式 策略模式

HEAD FIRST:策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 设计模式:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换.本模式使得算法可独立于它的客户而变化. 大话设计模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. 使用这个模式的原因: 用许多的算法对一类进行计算.那么如果把这些算法强行编码到这个类当中.其实是不可取的.因为很多时候下不同的情况下使用不同的算