gpt4 book ai didi

c# - 插件模式 - IoC/DI 与否?

转载 作者:太空狗 更新时间:2023-10-30 00:06:44 25 4
gpt4 key购买 nike

只是一个非常笼统的问题,不仅适用于这个例子。

假设您有一家在线商店,您想要实现代金券/礼券,但有约束条件。假设您有一张 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com