如果现在有一个账单的规则,有多种不同的计费方式( 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 判断计费周期更好的方式?后面还要考虑到滞纳金的计算
1
leopod1995 2023-05-29 15:52:29 +08:00
统一的消费记录 然后根据不同的计费模式开不同的表 每种表对应相应的计费模式 后续也好拓展 数据从消费记录拿 定时去写统计表 或者消费记录表去触发
坏处是数据冗余太多,好处是逻辑性能好 |
2
iffi 2023-05-29 15:58:13 +08:00 1
感觉这种多维度变化的时候用 桥接模式,要不你试试
|
3
iyiluo 2023-05-29 16:10:07 +08:00 1
责任链,只处理符合条件的账单
|
4
thinkershare 2023-05-29 16:19:17 +08:00 1
为每个算子策略提供 factory, 每个策略有自己独立的 Factory.
|
5
fiypig 2023-05-29 16:22:16 +08:00 1
房租季度收租, 电费月度收租,这个意思吗
|
6
7911364440 2023-05-29 16:31:13 +08:00 1
桥接模式,计费方式接口给每个计费周期单独定义方法。
再给计费周期定义成桥接类,每个类型的桥接类调用不同的计费方式接口的方法。 |
7
NGXDLK 2023-05-29 17:21:13 +08:00 1
策略模式可以实现,但如果套娃的话确实有点累赘;
桥接的话,看起来好像会简洁一点,可以尝试一下。 扔个链接:桥接模式 https://www.runoob.com/design-pattern/bridge-pattern.html |
8
unregister OP |
9
unregister OP |
10
zhoupeng199 2023-05-29 19:55:12 +08:00 1
|
11
unregister OP @zhoupeng199 是的,看了职责链模式,感觉确实很合适。👍账单规则,计费周期,还有滞纳金,比如还有计费的精度都可以用 Handler 去处理
|
12
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() } ``` |
13
japeth 2023-05-30 14:17:11 +08:00
责任链模式
|
14
unregister OP |