C# 用装饰模式实现蝌蚪变青蛙的过程

在面向对象的理论中,始终强调是抽象与组合以及一些其他面向对象的机制比如继承,封装和多态。

前面的文章都将有抽象是什么,至于抽象如何使用,就是把实现往上总结共性而去除特性,由此得到抽象层次和实现层次,所以设计模式中的基本上很多都是利用这种方法来实现面向对象的抽象,以使得软件能够降低变化带来的影响。

 

我们知道C#是一种强类型的语言,也就是对象的行为在定义的时候就确定好了,如果要使用另外的行为,要么使用静态定义时期的继承机制,另外一种方法就是组合(是一种动态机制,可以在程序运行期间给对象加上行为,这就是造就个体的差异,这种和我们的发展观是符合的。实际上在设计的过程中就是一动一静相互平衡和谐。)

 

接下来讲的是在动态时期给对象实例加上行为。

故事是一只动物也就是上帝创造的一只蝌蚪,或许生下来就能游泳,然后经历一段时间的进化慢慢长成了青蛙,青蛙王子就能呼吸了。

在Javascript动态弱类型的实现动态给对象实例加上行为是没有难度的,可是给一个对象实例加上行为在C#这种静态类型机制中,实现是有难度的,不过现在的C#支持动态属性这种方法。

 

在设计模式中也有一种装饰(decorator)模式,意图是给对象增加行为。

 

image

 

实现的过程是先定义蝌蚪,青蛙都是一种动物类型。

namespace DecoratorPattern
{
    abstract class Animal
    {
         public abstract void Run();
    }
}

 

namespace DecoratorPattern
{
    class Tadpole :Animal
    {
        private Animal animal;

        public Tadpole(Animal animal)
        {
            this.animal = animal;
        }

        public override void Run()
        {
            Console.WriteLine("我是一只蝌蚪");
        }
    }
}

 

namespace DecoratorPattern
{

    class Frog:Animal
    {
        private Animal animal;

        public Frog(Animal animal)
        {
            this.animal = animal;
        }

        public override void Run()
        {
            Console.WriteLine("我是一只青蛙");
        }
    }
}

 

然后游泳行为和呼吸行为也抽象为对象(在这里没有定义成接口)

namespace DecoratorPattern
{
    class Swimable : Animal
    {
        private Animal animal;

        public Swimable(Animal animal)
        {
            this.animal = animal;
        }

        public override void Run()
        {
            animal.Run();
            Console.WriteLine("我是能游泳的");
        }
    }
}

 

namespace DecoratorPattern
{
    class Breathable : Animal
    {
        private Animal animal;

        public Breathable(Animal animal)
        {
            this.animal = animal;
        }

        public override void Run()
        {
            animal.Run();
            Console.WriteLine("我上岸了,我能呼吸啦.");    
        }
    }
}

 

 

上帝类型负责造物以及进化的过程

这样客户端看不出后台发生了什么变化,使用静态工厂模式隐藏创建和进化的过程。这样我们的客户端代码才会看起来优美流畅(哈哈顺便把我的代码也包括了)。

namespace DecoratorPattern
{
    class God
    {
        public static Tadpole CreateKedou()
        {
            return new Tadpole(null);
        }

        internal static Swimable FirstJinhua(Animal single)
        {
            Swimable swimable = new Swimable(new Tadpole(single));
            return swimable;
        }

        internal static Breathable SecondJinhua(Animal single)
        {
            Breathable breathable = new Breathable(new Frog(single));
            return breathable;
        }
    }
}

 

具体的源码见附件。TagpoleBecomesFrog

posted @ 2010-06-29 21:30  richardzeng  阅读(2323)  评论(6编辑  收藏  举报