`

装饰者模式(Decorator)

阅读更多

 

    每天上班都要跑很远,既要走公路,又要爬山。不过现在我有一辆小车,可以在公路上跑。我还有一个飞行器,可以翻山。嘿,如果我高兴我还可以用飞行器吊着小车跑(当然我的小车重量是可以忽略的,要不我直接用飞行器不就行了吗,之所以这样我想它即是汽车也是飞行器,两者的功能可以同时发挥)。
  看看我的设计吧:

这是装饰者和被装饰这共同的接口(也就是说我,飞行器,小汽车说到底可以看成是同一类东西)

 public abstract class Component
    
{
        
public abstract void Run();
    }

装饰者接口
public abstract class Decorator:Component
    
{
       
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");
        }

    }

小汽车
class Car:Decorator
    
{
        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());
        }

        
    }

客户代码:
 class Program
    
{
        
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();
真是庄周梦蝶,孰蝶是我,我是孰蝶啊。
我来了也(Component a1 = new ManA();),坐到汽车里面了也(new Car(a1)),变汽车了也(a1 = new Car(a1);)
看飞机来了也,汽车到飞机里去了也,汽车变飞机了也,飞机飞走了也。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics