一个设计模式相关的问题,怎么计算账单的费用?符合开闭原则

335 天前
 unregister

如果现在有一个账单的规则,有多种不同的计费方式( Billing A ,B ,C ,D ,E ),然后每一种计费方式还有一些主要的区别,每种计费方式还对应不同的计费周期,比如两种计费周期(计费月和自然月)计费月账单周期是比如说 2 月 14-3 月 13 ,3 月 14-4 月 13 ,自然月则比如是 2 月 1 号-2 月 28 号,3 月 1 号-3 月 31 。如果使用策略模式的话 A ,B ,C ,D ,E 五种策略,但里面都还要判断一下计费月还是自然月类型的,感觉这个比较累赘。就好比我一辆混动车子都能开,但是里面有时候烧油,有时候烧电。有没有比五种策略模式里用 if else 判断计费周期更好的方式?后面还要考虑到滞纳金的计算

1476 次点击
所在节点    程序员
14 条回复
leopod1995
335 天前
统一的消费记录 然后根据不同的计费模式开不同的表 每种表对应相应的计费模式 后续也好拓展 数据从消费记录拿 定时去写统计表 或者消费记录表去触发

坏处是数据冗余太多,好处是逻辑性能好
iffi
335 天前
感觉这种多维度变化的时候用 桥接模式,要不你试试
iyiluo
335 天前
责任链,只处理符合条件的账单
thinkershare
335 天前
为每个算子策略提供 factory, 每个策略有自己独立的 Factory.
fiypig
335 天前
房租季度收租, 电费月度收租,这个意思吗
7911364440
335 天前
桥接模式,计费方式接口给每个计费周期单独定义方法。
再给计费周期定义成桥接类,每个类型的桥接类调用不同的计费方式接口的方法。
NGXDLK
335 天前
策略模式可以实现,但如果套娃的话确实有点累赘;
桥接的话,看起来好像会简洁一点,可以尝试一下。

扔个链接:桥接模式 https://www.runoob.com/design-pattern/bridge-pattern.html
unregister
335 天前
@iffi 是的,桥接模式适合多个维度的
@7911364440 是的,厉害了
@NGXDLK 确实是桥接模式适合解决这种情况。
unregister
335 天前
zhoupeng199
335 天前
unregister
335 天前
@zhoupeng199 是的,看了职责链模式,感觉确实很合适。👍账单规则,计费周期,还有滞纳金,比如还有计费的精度都可以用 Handler 去处理
zzyphp111
334 天前
桥接模式比较合适,下面是一个例子

```go
// 实现部分
type DrawAPI interface {
drawCircle(radius int, x int, y int)
}
type RedCircle struct{}
func (r *RedCircle) drawCircle(radius int, x int, y int) {
fmt.Printf("Drawing Circle[ color: red, radius: %d, x: %d, y: %d]\n", radius, x, y)
}
type GreenCircle struct{}
func (g *GreenCircle) drawCircle(radius int, x int, y int) {
fmt.Printf("Drawing Circle[ color: green, radius: %d, x: %d, y: %d]\n", radius, x, y)
}

// 抽象部分
type Shape interface {
draw()
}
type Circle struct {
x int
y int
radius int
drawAPI DrawAPI
}
func (c *Circle) draw() {
c.drawAPI.drawCircle(c.radius, c.x, c.y)
}

// 使用桥接连接抽象和实现
func main() {
redCircle := &Circle{1, 2, 3, &RedCircle{}}
greenCircle := &Circle{4, 5, 6, &GreenCircle{}}
redCircle.draw()
greenCircle.draw()
}
```
japeth
334 天前
责任链模式
unregister
334 天前
@zzyphp111 职责链模式感觉更合适,因为还需要满足其他条件,比如滞纳金,计费精度啥的,可以依次使用各不同的 handler 处理
@japeth 是的🤙

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/943915

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX