每天上班都要跑很远,既要走公路,又要爬山。不过现在我有一辆小车,可以在公路上跑。我还有一个飞行器,可以翻山。嘿,如果我高兴我还可以用飞行器吊着小车跑(当然我的小车重量是可以忽略的,要不我直接用飞行器不就行了吗,之所以这样我想它即是汽车也是飞行器,两者的功能可以同时发挥)。
看看我的设计吧:
这是装饰者和被装饰这共同的接口(也就是说我,飞行器,小汽车说到底可以看成是同一类东西)
public abstract class Component
{
public abstract void Run();
}
{
public abstract void Run();
}
装饰者接口
public abstract class Decorator:Component
{
public override void Run()
{
Console.WriteLine("I'am Decorator ");
}
}
{
public override void Run()
{
Console.WriteLine("I'am Decorator ");
}
}
飞行器:
class Aerocraft:Decorator
{
Component comp;
public Aerocraft(Component comp)
{
this.comp = comp;
}
public override void Run()
{
comp.Run();
Console.WriteLine("aerocraft run");
}
}
{
Component comp;
public Aerocraft(Component comp)
{
this.comp = comp;
}
public override void Run()
{
comp.Run();
Console.WriteLine("aerocraft run");
}
}
小汽车
class Car:Decorator
{
Component comp;
public Car(Component comp)
{
this.comp = comp;
}
public override void Run()
{
this.comp.Run();
Console.WriteLine("Car run");
}
}
{
Component comp;
public Car(Component comp)
{
this.comp = comp;
}
public override void Run()
{
this.comp.Run();
Console.WriteLine("Car run");
}
}
这就是我了。
class ManA:Component
{
public override void Run()
{
Console.WriteLine(this.ToString());
}
}
{
public override void Run()
{
Console.WriteLine(this.ToString());
}
}
客户代码:
class Program
{
static void Main(string[] args)
{
Component a = new Aerocraft(new Car(new ManA()));//我被汽车包装,汽车被飞行器包装。
a.Run();
Console.ReadLine();
}
}
{
static void Main(string[] args)
{
Component a = new Aerocraft(new Car(new ManA()));//我被汽车包装,汽车被飞行器包装。
a.Run();
Console.ReadLine();
}
}
运行结果:
Decorator.ManA
Car run
aerocraft run
注意:ManA 是被装饰者(被包在里面了哦),汽车和飞行器是装饰者。装饰者的作用就是扩展被装饰者(当然还可以是装饰者,上面的Aerocraft就装饰了Car)的能力。本来我不具备汽车跑的能力。也不具备飞行器飞的能力。但是我们都是Component啊。既然是同宗,你能就是我能嘛。而且这种能力能层层借用哦。
Component a = new Aerocraft(new Car(new ManA()));//和下面的这个是一样的
Component a1 = new ManA();
a1 = new Car(a1);
a1 = new Aerocraft(a1);
a1.Run();
真是庄周梦蝶,孰蝶是我,我是孰蝶啊。a1 = new Car(a1);
a1 = new Aerocraft(a1);
a1.Run();
我来了也(Component a1 = new ManA();),坐到汽车里面了也(new Car(a1)),变汽车了也(a1 = new Car(a1);)
看飞机来了也,汽车到飞机里去了也,汽车变飞机了也,飞机飞走了也。