[转载]C# 用装饰模式实现蝌蚪变青蛙的过程 – Richard 时间@脚印 – 博客园.
在面向对象的理论中,始终强调是抽象与组合以及一些其他面向对象的机制比如继承,封装和多态。
前面的文章都将有抽象是什么,至于抽象如何使用,就是把实现往上总结共性而去除特性,由此得到抽象层次和实现层次,所以设计模式中的基本上很多都是 利用这种方法来实现面向对象的抽象,以使得软件能够降低变化带来的影响。
我们知道C#是一种强类型的语言,也就是对象的行为在定义的时候就确定好了,如果要使用另外的行为,要么使用静态定义时期的继承机制,另外一种方法 就是组合(是一种动态机制,可以在程序运行期间给对象加上行为,这就是造就个体的差异,这种和我们的发展观是符合的。实际上在设计的过程 中就是一动一静相互平衡和谐。)
接下来讲的是在动态时期给对象实例加上行为。
故事是一只动物也就是上帝创造的一只蝌蚪,或许生下来就能游泳,然后经历一段时间的进化慢慢长成了青蛙,青蛙王子就能呼吸了。
在JavaScript动态弱类型的实现动态给对象实例加上行为是没有难度的,可是给一个对象实例加上行为在C#这种静态类型机制中,实现是有难度 的,不过现在的C#支持动态属性这种方法。
在设计模式中也有一种装饰(decorator)模式,意图是给对象增加行为。
实现的过程是先定义蝌蚪,青蛙都是一种动物类型。
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