装饰者模式(Decorator)

本文通过一个生动的例子介绍了装饰者模式的应用。作者将自己比喻为一个核心组件,通过被不同的装饰者(如汽车和飞行器)包装,实现了从步行到驾驶再到飞行的能力扩展。通过具体的C#代码展示了如何实现这一模式。

 

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

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

 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);)
看飞机来了也,汽车到飞机里去了也,汽车变飞机了也,飞机飞走了也。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值