基于策略模式的商场价格优惠设计

本文为个人的论文,由于一些原因未能发表,所以拿出来和朋友分享下

注:本文配有源码,如有需要的朋友,请在留言中留下邮箱地址,我会在第一时间发送

    本文介绍一种基于策略模式的商场价格优惠管理的改进设计。本设计针对传统策略模式所暴露出来的不足和功能的限制,采用多种设计模式的组合以及灵活的理念,使得功能更加符合用户的需求。

 

引言

以往我们都是使用传统的策略模式来对商场促销功能进行设计,但是由于其传统的缺点和单一的处理策略并不能满足用户同时进行多种策略操作以及客户端和底层代码的灵活调用。所以,这些不足为我们改进策略模式提供了思路。

1 设计思路

1.1 问题的产生

使用传统的策略模式暴露的问题如下:

(1)       策略类数量较多,所有的策略类都需要对外暴露。

(2)       不能灵活处理多种策略的绑定。

(3)       与客户端的交互不够灵活。

1.2 解决方法

针对上述问题,可以通过不同设计模式(工厂方法模式、门面模式和模板模式)的组合以及策略枚举的组合,从而避免上述问题(详见总体设计)。

1.3 设计理念

对于一般的策略模式设计,其只能解决一种策略的实现,对于多种策略的组合有一定的局限性。因此,为了使两种策略思想的实现更加灵活,本设计采用“若干优惠组合策略包含单一优惠策略”的理念。

2         总体设计

2.1 传统模式设计构架

为了更好地说明传统模式和改进模式设计的不同,本文在介绍传统模式的基础上对改进模式进行详细说明。

在传统模式之中,实体类Purchase代表一个销售类与类User构成一对一的关系,其设计类图如图1所示。

传统的处理策略---本设计主要列举了打折策略(Discount)、等价策略(Equal)、满多少送多少策略(UpToUp)、用户积分策略(UserScore)。上述策略必须实现StrategyType接口,目的有两点:1、对策略进行抽象;2、上层代码可以通过接口进行编程。此外,这些策略必须通过一个封装类StrategyContext来使上层代码方便调用相应策略类。其类图如图2所示。

图1

图2

在传统的客户端与底层代码的交互中,往往直接通过调用相关的策略类来进行设计。但是,在策略颇多和逻辑复杂的系统中这样的设计为日后的维护和功能扩展带来了不小的麻烦。下文着重介绍改进后的策略模式。

2.2 改进模式设计构架

首先,在实体类的设计中,增加一个PurchaseBind类,这个类主要负责记录多种策略的组合,并且被类Purchase继承。其类图如图3所示。

图3

在图3的设计中,对金额的操作上并没有使用传统认为的double型,而是采用了易于操作的int型,这样做的原因有:1、int类型比double、float类型处理更方便,不用考虑进位取舍问题(取舍是有误差的);2、目前的二进制存储机制对一些浮点数是无法准确表达的。

其次,在策略类的实现上,上述传统的设计方法并不能满足若干销售策略进行组合的需求,因为上层模块需要调用更新的User对象,而策略类并不能向上层代码传递更新的对象。为了解决这一问题,采用如下设计,由于篇幅限制,本文只列出Discount类的相关设计,其他策略类相似。类图如图4所示。

图4

所以,更新后的User对象就能够通过执行父类StrategyParent中的方法将该对象即时储存在Helper类声明的列表中。上层代码通过调用Helper类中getChangeUser()方法,来获得更新的User对象,进而根据相应组合策略对更新的User对象递归遍历。

同时,为了解决传统策略模式的缺陷:所有的策略类都暴露出去,暴露的越多以后的修改风险也就越大。所以采用一个类似于增加一个配置文件的方法,实现策略类的隐藏,即策略枚举。枚举与策略类进行映射处理,避免高端模块直接访问策略类,同时使用工厂方法模式根据映射产生策略对象,其类图如图5所示。

图5 

最后,采用门面模式对高层(客户端)模块与策略工厂模块的动态交互进行优化,从而封装了客户端与策略工厂之间的交互流程。这个流程主要分为以下几个子流程:

(1)       解析在类PurchaseBind中保存在LinkedList链表中的若干策略枚举,将其以参数形式传递给工厂。

(2)       通过递归调用,获得即时更新的User对象,将其与相应策略匹配。

(3)       执行相应方法,用相应策略处理相应User对象。

这一流程封装在类StrategyFacade中,其类图如图6所示:

图6

这样,在传统策略模式的基础上,通过对相应流程进行改进,不仅克服了传统模式的缺点,而且更加符合灵活的设计理念。由于篇幅的限制,只列出了相关设计类图而对代码进行了省略。

结束语

本设计遵循灵活的设计理念,通过其他相关设计模式对策略模式进行了优化,将抽象复杂的销售策略相对具体的设计出来。因此,不仅满足了组合策略的需求,而且同时也满足了单一策略的需求,更加有利于对相关销售金额管理系统的日后维护。

参考资料:

[1] 秦小波 设计模式之禅. 北京:机械工业出版社,2010

[2] 程杰 大话设计模式. 北京:清华大学出版社,2007

[3] http://seaizon.iteye.com/blog/753762

[4] 杨年华、张礼平 JAVA类库中的策略模式. 计算机应用与软件,2004

基于策略模式的商场价格优惠设计相关推荐

  1. java商场满减活动_Java使用策略模式解决商场促销商品问题示例

    本文实例讲述了Java使用策略模式解决商场促销商品问题.分享给大家供大家参考,具体如下: 一 模式定义 策略模式:定义一系列的算法,将每一种算法封装起来并可以相互替换使用,策略模式让算法独立于使用它的 ...

  2. 策略模式一商场促销商品

    一模式定义 策略模式:定义一系列的算法,将每一种算法封装起来并可以相互替换使用,策略模式让算法独立于使用它的客户应用而独立变化. 二模式举例 1模式分析 我们借用商场促销商品来说明这一模式. 2策略模 ...

  3. springboot基于web模式的师资管理系统的设计与实现 毕业设计-附源码040928

    springboot师资管理系统设计与实现 摘 要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理.在现实运用中,应用软件的工作 ...

  4. (附源码)springboot基于web模式的师资管理系统的设计与实现 毕业设计040928

    springboot师资管理系统设计与实现 摘 要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理.在现实运用中,应用软件的工作 ...

  5. 设计模式——策略模式(多种促销优惠方案优化)

    很多电商平台都会推出优惠活动.优惠策略有很多种,如领取优惠券抵扣.返现促销.拼团优惠.秒杀优惠等. 下面我们使用策略模式来模拟实现电商中多种促销优惠方案的选择 首先创建一个抽象策略角色 Promoti ...

  6. 策略模式--实现商场打折

    前言: 上一篇博客中写明了简单工厂的引用,其实这篇博客和上一篇类似,是利用了策略加简单工厂的方法实现的.为了我们的重构可以运用上设计模式,本次运用了客户端的形式展现出来,具体请往下看: 策略模式: 顾 ...

  7. 设计模式四:策略模式

    策略模式 所谓策略其实就是做一件事情有很多很多的方法,比如说一个商场要搞促销,促销的方式有可能有很多:打折啊,满100返50啊.积分等等之类的.这种不同的促销方式在我们系统中表示就是一个一个的策略,并 ...

  8. 设计模式学习笔记(二十四):策略模式

    1 概述 1.1 引言 在外出旅游时,很多时候的出行方式都不止一条,通常根据实际情况,比如目的地,预算,旅游时间等确定最适合的出行方式.在软件开发中,也常常会遇到类似的情况,实现某一个功能有多种途径, ...

  9. JavaScript版本的策略模式

    俗话说,条条大路通罗马.在美剧<越狱>中,主角Michael Scofield就设计了两条越狱的道路.这两条道路都可以到达靠近监狱外墙的医务室. 同样,在现实中,很多时候也有多种途径到达同 ...

最新文章

  1. 难道这是残差结构的本质(addnorm)
  2. 常用的排序算法的时间复杂度和空间复杂度
  3. TPC-W安装与配置(威斯康星大学Java版)
  4. 快速搭建LNMP(1 )
  5. 安装SQL Server2008错误解决方案
  6. Standard C Episode 8
  7. CSS单位之战:EM与。 REMs ...打架! ?
  8. jquery怎么判断不同的字显示不同的颜色_不知道怎么封装代码?看看这几种设计模式吧!...
  9. python数据结构剑指offer-链表中环的入口结点
  10. 为什么对流层散射通信距离远、容量大、_中级通信工程师|「专业实务」第9章重点学习内容!...
  11. 在mysql的操作界面中,如何清屏幕
  12. C++笔记---函数声明(prototype)
  13. YUV420查表法高效、无失真的转换为RGB32格式
  14. Java ThreadLocal study 2
  15. 【我评】——关于《中國化風格的淺析》
  16. 关于perl6的若干问题?
  17. 190816每日一句
  18. 【POJ1276】【多重背包】凑货币问题
  19. 重学前端学习笔记(四十一)--CSS的颜色
  20. 家庭网关斐讯 K3 基础环境篇

热门文章

  1. Linux之特殊的环境变量IFS以及如何删除带有空格的目录
  2. mysqld或mysqld_safe启动时必须放在第一位的参数(first argument)
  3. 二季度美国新增2.4吉瓦太阳能容量
  4. CentOS 7 安装VirtualBox
  5. Nginx学习之一:从权威途径(wiki)了解Nginx
  6. hdu 2255 奔小康赚大钱 KM算法
  7. Maven实战(四)——基于Maven的持续集成实践
  8. 兄弟 你们永远是我的大哥哥
  9. Nginx 二级子域名完美方案
  10. string : undeclared identifier 出错原因