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

2023-05-29 15:45:11 +08:00
 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 判断计费周期更好的方式?后面还要考虑到滞纳金的计算

1689 次点击
所在节点    程序员
14 条回复
leopod1995
2023-05-29 15:52:29 +08:00
统一的消费记录 然后根据不同的计费模式开不同的表 每种表对应相应的计费模式 后续也好拓展 数据从消费记录拿 定时去写统计表 或者消费记录表去触发

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

扔个链接:桥接模式 https://www.runoob.com/design-pattern/bridge-pattern.html
unregister
2023-05-29 17:32:37 +08:00
@iffi 是的,桥接模式适合多个维度的
@7911364440 是的,厉害了
@NGXDLK 确实是桥接模式适合解决这种情况。
unregister
2023-05-29 17:36:15 +08:00
zhoupeng199
2023-05-29 19:55:12 +08:00
unregister
2023-05-29 22:09:13 +08:00
@zhoupeng199 是的,看了职责链模式,感觉确实很合适。👍账单规则,计费周期,还有滞纳金,比如还有计费的精度都可以用 Handler 去处理
zzyphp111
2023-05-30 13:51:26 +08:00
桥接模式比较合适,下面是一个例子

```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
2023-05-30 14:17:11 +08:00
责任链模式
unregister
2023-05-30 14:57:24 +08:00
@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