Fork me on GitHub
C# 用装饰模式

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

以后打算在博客园安家,写下自己对技术的一点微薄见解,所以特此做一个文章索引 圣殿骑士博文索引,如果有感兴趣的同仁,可以关注,如能起到帮助作用,那就是我莫大的荣幸!


作者:圣殿骑士
出处:http://www.cnblogs.com/leo_wl/
关于作者:专注于微软平台项目架构、管理和企业解决方案。自认在面向对象及面向服务领域有一定的造诣,熟悉设计模式、TDD、极限编程、领域驱动、架构设计、敏捷开发和项目管理。现主要从事WinForm、ASP.NET、WPF、WCF、WF、Silverlight 、Biztalk、Windows Azure方面的项目开发、架构和管理工作。如有问题或建议,请多多赐教!
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过MSN(bjhyey_wl@126.com  )联系我,非常感谢。


       快速评论通道--您对本文的宝贵意见:
       
感谢您的鼓励和批评,它将是我进步的动力

posted on 2010-06-30 09:35  HackerVirus  阅读(263)  评论(0编辑  收藏  举报