每次从海淀黄庄坐地铁都会经过一个卖煎饼的小店。
一个标准煎饼(7块钱):一个鸡蛋+一片菜叶子+脆饼
有个灵活的地方是,可以加自己喜欢的材料,比如,加一个鸡蛋,需要多付1块钱。
加一个鸡排需要多加4块钱。
作为KB的IT民工,就像能不能设计一个系统来自动计算煎饼的系统。
刚开始设计的时候,设计方案如下: 先设计一个标准煎饼类,然后不同口味的继承标准类别。
然而,一天排队买煎饼的时候,前排一美女说要点3蛋煎饼。
如何扩展现有的类? 如果来个8蛋煎饼+4个鸡排呢?
在一筹莫展的时候,翻了一下设计模式,很欣喜的发现有decorator pattern 可以解决如下问题, 其定义如下(来自wikipedia):
修饰模式,是面向对象编程领域中,一种动态地往一个类中添加新的行为的设计模式。就功能而言,修饰模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些功能。
主要目标是对每个对象加一点修饰。
例如:我们要一个双蛋+鸡排煎饼,分解开来:标准煎饼+一个蛋+鸡排。我们所需要做的是创建一个标准煎饼对象,然后点缀一个鸡蛋和一个鸡排,就可以了。
C#模拟如下:
public interface ChinesePancake
{
string Description();
double Cost();
}
/// <summary>
/// Including an egg
/// </summary>
public class StardandChinesePancake : ChinesePancake
{
public string Description()
{
return "vanilla chinese pancake";
}
public double Cost()
{
return 7.0;
}
}
public class Egg : ChinesePancake
{
ChinesePancake pancake;
public Egg(ChinesePancake pc)
{
pancake = pc;
}
public string Description()
{
return pancake.Description() + ", add egg";
}
public double Cost()
{
return pancake.Cost() + 1.0;
}
}
public class ChickenSteak : ChinesePancake
{
ChinesePancake pancake;
public ChickenSteak(ChinesePancake cp)
{
pancake = cp;
}
public string Description()
{
return pancake.Description() + ", chicken steak";
}
public double Cost()
{
return pancake.Cost() + 4.0;
}
}
测试例子:
static void Main(string[] args)
{
ChinesePancake cp = new StardandChinesePancake();
cp = new Egg(cp);
cp = new ChickenSteak(cp);
Console.WriteLine(cp.Description() + ": " + cp.Cost());
}
输出如下: vanilla chinese pancake, add egg, chicken steak: 12