- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
只是一个非常笼统的问题,不仅适用于这个例子。
假设您有一家在线商店,您想要实现代金券/礼券,但有约束条件。假设您有一张 20% 折扣的优惠券,但这仅适用于最近 3 周内添加的产品,而不适用于特价促销中的产品。
我看到了两种解决方法:第一种方法是将您的商店编码为“本地”支持所有疯狂类型的优惠券。这似乎是经典方式,但这意味着大量的事先工作和非常少的灵 active (毕竟,你无法事先知道你需要什么,也许销售人员可能会想出一些非常棒的新促销事件,需要新的优惠券- 下周一之前)。
第二种方式是插件方式:优惠券就像插件一样,每个优惠券都有自己的代码。您将购物篮传递给凭证,然后凭证本身会检查每个项目是否适用,进行必要的更改并返回更改后的购物车。
我只是想知道,案例 2 的设计模式是什么?它看起来有点像 IoC/DI,但又不是真的,因为凭证不会取代任何现有功能。它更像是一组具有特殊接口(interface)(即 IVoucher)的对象,然后是迭代的 IVoucher 对象队列。这些类型的“操纵器”是否有标准模式(和最佳实践)?
编辑:感谢您的回答。稍微澄清一下,优惠券(或操纵器 - 如前所述,这不仅是关于在线商店的问题,也是关于类似情况的问题)是“重”对象,即它们中包含业务逻辑。所以我可以说代金券仅适用于客户在 2008 年 1 月 1 日之前注册,仅当客户在过去 6 个月内至少订购了 100 美元,仅适用于类别 X 中的商品,与其他代金券“堆叠”除外对于标记为 Reduced 等的项目,等等。所以我更关心的是如何保持一个干净的结构,以确保优惠券获得他们需要的所有东西,以检查它们是否适用并能够操纵购物车,所以我想知道关于这种情况的标准是什么,这正是访问者模式似乎要做的事情。
最佳答案
在这种情况下,您可以使用 the strategy pattern连同 the vistor pattern计算篮子的值(value)。
访客可以使用不同的策略(在本例中为折扣券)访问购物篮中的每件商品,并使用这些策略来计算购物篮的全部成本。
使用的优惠券可以通过某种方式从数据库中检索并很容易地注入(inject)到访问者中。
优惠券策略可能如下所示:
public interface IVoucher
{
decimal CostOf(CartItem cartItem);
}
默认是这样的:
public class FullPriceVoucher : IVoucher
{
public decimal CostOf(CartItem cartItem)
{
return cartItem.Cost;
}
}
10% 的折扣类似于:
public class TenPercentOffVoucher : IVoucher
{
public decimal CostOf(CartItem cartItem)
{
return cartItem.Cost * 0.9m;
}
}
然后您可以让访问者像这样计算购物车值(value):
public class CartValueVisitor
{
private IVoucher voucher;
public CartValueVisitor(IVoucher voucher)
{
this.voucher = voucher;
}
public decimal CostOf(Cart cart)
{
return cart.Items.Sum(item => voucher.CostOf(item));
}
}
你会这样使用:
var cart = GetACart();
var fullPriceCartValueVisitor =
new CartValueVisitor(new FullPriceVoucher());
var tenPercentOffCartValueVisitor =
new CartValueVisitor(new TenPercentOffVoucher());
var fullPrice = fullPriceCartValueVisitor.CostOf(cart);
var tenPercentOffPrice = tenPercentOffCartValueVisitor.CostOf(cart);
这显然一次只适用于一张凭证,但应该让您了解一般结构。
关于c# - 插件模式 - IoC/DI 与否?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/594608/
我在互联网上搜索了很多小时,但没有找到满意的结果,所以 -VSTO Addin 和 COM Addin(我们作为类库项目制作并使用 Excel 对象)之间有什么区别?VSTO 项目是否有任何限制,例如
我在互联网上搜索了很多小时,但没有找到满意的结果,所以 -VSTO Addin 和 COM Addin(我们作为类库项目制作并使用 Excel 对象)之间有什么区别?VSTO 项目是否有任何限制,例如
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我正在寻找有关如何构建可扩展 WCF 服务器(具有动态加载的服务)的建议,最好使用 System.Addins 或 MEF。 服务器应托管实现最小“插件”API(StartService/StopSe
有没有一种方法可以使用加载浏览器扩展/插件/插件的 headless 浏览器(即 PhantomJS、Selenium)来运行自动测试? 更具体地说,我想模拟广告拦截器(如 Ghostery、ad-b
我是 gradle 的新手,我使用 artifactory 作为我的 repo 服务器。我在网上查看了如何将我的项目发布到我的 repo 服务器,发现我可以使用 maven-publish 或使用 a
我想禁用某些状态的点击/事件,并仅使少数状态可点击。我通读了http://newsignature.github.io/us-map/处的文档,并且找不到与此问题相关的任何内容。 最佳答案 http:
据我了解,在Intellij中使用idea插件打开Maven构建的项目并不是最好的方法,即调用: mvn idea:idea 但是直接打开pom文件(Intellij有默认的Maven插件);同样的事
使用Artifactory plugin对于 Jenkins pipeline 来说是一种幸福,只要遵循文档就可以了。但后来我介绍了Maven Flatten plugin解析父模块和子模块 mvn
我已经安装了Elasticsearch版本1.7.1。一切正常。我也安装了 JDBC 驱动程序。检查下面我的插件文件夹 目录E:\Xampp\htdocs\my-elastic\elasticsear
在我使用 webpack common chunks 插件创建包含第三方库(如 angular、react、lodash 等)的 vendor 包之前,但后来我知道了 webpack dll
我们正在尝试使用(Jenkins、sonar、eclipse ...)安装 CI 平台。 为了让每个开发人员都可以在提交之前对他的代码进行分析,我想知道两种选择: 使用 Sonar 插件运行本地分析。
我知道这是一个比较特殊的问题。尽管如此,也许有些人知道这一点: 我想在 Eclipse 中使用 Maven 编译 Hector=> 分支:0.7.0 和标签:hector-0.7.0-29(https
我卡住了。我一直在尝试寻找或自己创建一个简单的准系统示例,说明如何为 VS 2010 Express 创建 Outlook 插件。我知道这在 VS 2010 Pro 中更简单,但是,在快速版本中真的不
我有以下排除过滤器来忽略所有 R 文件类: findbugs-exclude-filter.xml 当我将它用于 FindBugs-IDEA 插件时,它可以
我刚开始玩 CakePHP,我发现了 Wildflower CMS .我喜欢这个想法,并打算开始修补它。不过,我有一个问题。 在自述文件中,我发现了以下内容:“Wildflower 不是也不会是 Ca
虽然现在大部分情况都是使用n-api来编写插件,但是底层毕竟是v8(和libuv),使用v8编写简单的插件,同时熟悉v8的使用。 本文介绍在写c++插件时,简单又常用的写法,其实本质上,写插件
本篇是 Python 系列教程第 3 篇,更多内容敬请访问我的 Python 合集 Visual Studio Code的安装非常简单,就不放这里增加文章篇幅了。 相比PyCharm,V
Maven – 插件 什么是 Maven 插件? Maven 实际上是一个依赖插件执行的框架,每个任务实际上是由插件完成。Maven 插件通常被用来: 创建 jar 文件 创建 war
我正在编写一个插件来添加带有标签 [deposit_page] 的页面;该标记应替换为一些 PHP 代码。 这就是我所拥有的,但它不起作用。有什么我遗漏或做错了什么吗? function deposi
我是一名优秀的程序员,十分优秀!