设计模式之二(decorator pattern)

每次从海淀黄庄坐地铁都会经过一个卖煎饼的小店。

一个标准煎饼(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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值