复杂的价格计算,求讨论!

ahhisoft 2010-01-21 12:34:11
我们现在遇到了一个需求,要给商品计算价格,但是价格的算法包括参数都是不一样的。

比如:

橱柜可以按套卖,也可以按米卖,按米卖的话,3米多少钱,3米以后每延米多少钱,台面多少钱,上柜多少钱,下柜多少钱,总的在一起算出来一个总价;

磁砖:可以按块卖,也可以按平方卖;

移门:可以按套卖,也可以按米卖;

等等等等。。。

想请教各位高人,对于这种需求怎样处理比较合适?

请踊跃发言吧!!
...全文
300 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
ahhisoft 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kingboy2008 的回复:]
数据库中做一个算法的外键表。
根据你选择的计算方式用单价*数量


[/Quote]

但是商品的价格计算方式不是单价*数量拆散了算再加上这么简单。
可能会有很复杂的算法。不规则的。
灵雨飘零 2010-01-21
  • 打赏
  • 举报
回复
数据库中做一个算法的外键表。
根据你选择的计算方式用单价*数量

HarveyYan 2010-01-21
  • 打赏
  • 举报
回复
不错,这个值得研究。先mark
lovexilove 2010-01-21
  • 打赏
  • 举报
回复
up
ahhisoft 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 edward8819 的回复:]
引用 14 楼 ahhisoft 的回复:
引用 13 楼 edward8819 的回复:
用策略模式参数还有不固定的?参数就是抽象的基类或接口

引用 9 楼 ahhisoft 的回复:
我是想到用策略模式来做,不过参数也是不固定的。
在你的提醒下想到是否可以把参数包装再传过来?使用一个统一的类型来接收参数。


基类或接口要定义方法的参数不?


参考一下:

C# codepublicinterface ICountTotal
{decimal CountTotal();
}publicclass CountTotalByLength : ICountTotal
{privatedecimal _length;privatedecimal _price;public CountTotalByLength(decimal length,decimal price)
{this._length= length;this._price= price;
}#region ICountTotal Memberspublicdecimal CountTotal()
{returnthis._length*this._price;
}#endregion
}publicclass CountTotalByPart : ICountTotal
{privatedecimal _p1;privatedecimal _p2;privatedecimal _p3;public CountTotalByPart(decimal p1,decimal p2,decimal p3)
{this._p1= p1;this._p2= p2;this._p3= p3;
}#region ICountTotal Memberspublicdecimal CountTotal()
{return _p1+ _p2+ _p3;
}#endregion
}publicclass Context
{
ICountTotal count;public Context(ICountTotal ict)
{this.count= ict;
}publicdecimal CountTotal()
{return count.CountTotal();
}
}class Program
{staticvoid Main(string[] args)
{
Context c1=new Context(new CountTotalByLength(10,50));
Console.WriteLine("第一种价:"+ c1.CountTotal().ToString());
Context c2=new Context(new CountTotalByPart(10,20,30));
Console.WriteLine("第二种价:"+ c2.CountTotal().ToString());
}
}
[/Quote]

你这个是典型的策略模式,不过用到我这里恐怕还得再抽象一些才行。
因为客户端无法知道应该调用哪一个子类,也不知道具体的参数。
子类可以用工厂方法动态反射,不过参数定义要怎么办呢?

非常感谢您的回复!对我很有帮助!
snowmumu 2010-01-21
  • 打赏
  • 举报
回复
无意义的研究
acuerdo 2010-01-21
  • 打赏
  • 举报
回复
我现在的程序也有这样的需求。。。。

目前的做法 不同的算法写不同的公式,算总价出来了。
暂时没有把那些细致的单个数量和单价列出来。。。

明细要详细记录的话 还是全部列举出来 再归类吧~
  • 打赏
  • 举报
回复
对,就是太散了,算法并不难
liherun 2010-01-21
  • 打赏
  • 举报
回复
写一个方法里也行,就是判断比较多了点
HarveyYan 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 ahhisoft 的回复:]
引用 13 楼 edward8819 的回复:
用策略模式参数还有不固定的?参数就是抽象的基类或接口

引用 9 楼 ahhisoft 的回复:
我是想到用策略模式来做,不过参数也是不固定的。
在你的提醒下想到是否可以把参数包装再传过来?使用一个统一的类型来接收参数。


基类或接口要定义方法的参数不?
[/Quote]

参考一下:


public interface ICountTotal
{
decimal CountTotal();
}

public class CountTotalByLength : ICountTotal
{
private decimal _length;
private decimal _price;
public CountTotalByLength(decimal length, decimal price)
{
this._length = length;
this._price = price;
}
#region ICountTotal Members

public decimal CountTotal()
{
return this._length * this._price;
}

#endregion
}


public class CountTotalByPart : ICountTotal
{
private decimal _p1;
private decimal _p2;
private decimal _p3;
public CountTotalByPart(decimal p1, decimal p2, decimal p3)
{
this._p1 = p1;
this._p2 = p2;
this._p3 = p3;
}
#region ICountTotal Members

public decimal CountTotal()
{
return _p1 + _p2 + _p3;
}

#endregion
}


public class Context
{
ICountTotal count;
public Context(ICountTotal ict)
{
this.count = ict;
}
public decimal CountTotal()
{
return count.CountTotal();
}
}


class Program
{
static void Main(string[] args)
{
Context c1 = new Context(new CountTotalByLength(10, 50));
Console.WriteLine("第一种价:" + c1.CountTotal().ToString());
Context c2 = new Context(new CountTotalByPart(10, 20, 30));
Console.WriteLine("第二种价:" + c2.CountTotal().ToString());
}
}

ztenv 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ahhisoft 的回复:]
我是想到用策略模式来做,不过参数也是不固定的。
在你的提醒下想到是否可以把参数包装再传过来?使用一个统一的类型来接收参数。
[/Quote]
当然可以把参数包装起来。。。。可以试着做做,因为难度并不大
kkkkkkmn 2010-01-21
  • 打赏
  • 举报
回复
你可以这样
每种物品都有两种算法
先把算法写好
估计是每个算法三个参数
一个是物品
第二个是什么物品
第三是数量

现在什么都是人性化
你可以这样
假如我要瓷砖
5米
你就算如果按米算是多少钱
和按块算是多少钱
比较一下
这样比较人性化
也是你程序的亮点
mbh0210 2010-01-21
  • 打赏
  • 举报
回复
设置计算公式,自己解析公式进行计算.
ahhisoft 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 edward8819 的回复:]
用策略模式参数还有不固定的?参数就是抽象的基类或接口

引用 9 楼 ahhisoft 的回复:
我是想到用策略模式来做,不过参数也是不固定的。
在你的提醒下想到是否可以把参数包装再传过来?使用一个统一的类型来接收参数。

[/Quote]
基类或接口要定义方法的参数不?
HarveyYan 2010-01-21
  • 打赏
  • 举报
回复
用策略模式参数还有不固定的?参数就是抽象的基类或接口

[Quote=引用 9 楼 ahhisoft 的回复:]
我是想到用策略模式来做,不过参数也是不固定的。
在你的提醒下想到是否可以把参数包装再传过来?使用一个统一的类型来接收参数。
[/Quote]
guohousheng 2010-01-21
  • 打赏
  • 举报
回复
既然一种算法实现不了,你就静下心来一点点把算法归类写出来,听你说的意思也知道,你只是想找到最简单有效的方法,你实际详细分析,肯定能找到相对好点的算法归类,
asdfzxvc 2010-01-21
  • 打赏
  • 举报
回复
用一种算法估计是不行了~~
耐心点,把每种可能都写出来吧~
xenophane 2010-01-21
  • 打赏
  • 举报
回复
1.建算法表,类似如下字段,算法ID 、算法名称、产品类型、 公式、排序等
2.公式 使用标签,如{$ProPrice$}*{$ProNumber$}
标签值依据产品类型和算法类型不同而改变,但是算法不变
ahhisoft 2010-01-21
  • 打赏
  • 举报
回复
我是想到用策略模式来做,不过参数也是不固定的。
在你的提醒下想到是否可以把参数包装再传过来?使用一个统一的类型来接收参数。
ztenv 2010-01-21
  • 打赏
  • 举报
回复
支持策略模式
加载更多回复(3)

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧