装饰模式

Decorator:动态给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活;

以下为装饰模式的UML图:



1.        Component是定义一个对象接口,可以给这些对象动态添加职责;

2.        ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责;

3.        Decorator是装饰抽象类,继承了component,从外来类扩展component的功能,但是对于component来说,是无需知道Decorator存在的;

4.        其余继承了Decorator就是具体的装饰类,给component添加职责的功能;

以下为实现代码:

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

    public class ConcreateComponent : Component
    {
        public override void Operation()
        {
            Console.WriteLine("ConcreateComponent");
        }
    }

    public abstract class Decorator : Component
    {
        private Component _concreateComponent;

        public void SetDecorator(Component concreateComponent)
        {
            this._concreateComponent = concreateComponent;
        }

        public override void Operation()
        {
            if (_concreateComponent != null)
                _concreateComponent.Operation();
        }
    }

    public class ConcreateDecoratorA : Decorator
    {
        public override void Operation()
        {
            base.Operation();
            Console.WriteLine("ConcreateDecoratorA");
        }
    }

    public class ConcreateDecoratorB : Decorator
    {
        public override void Operation()
        {
            base.Operation();
            Console.WriteLine("ConcreateDecoratorB");
        }
}

客户端的调用代码:
ConcreateComponent com = new ConcreateComponent();
    ConcreateDecoratorA comA = new ConcreateDecoratorA();
    ConcreateDecoratorB comB = new ConcreateDecoratorB();

    comA.SetDecorator(com);
    comB.SetDecorator(comA);
comB.Operation();

代码执行步骤:

1.  实例化ConcreateComponent、ConcreateDecoratorA、ConcreateDecoratorB三个对象;继承对象的实例化顺序为:先实例化准备实例化的父类,依次往上直至object类,实例化的顺序为从object开始依次往下实例化,直至实例化到待实例化的对象;

2.      comA继承自Decorator,所以comA类继承了变量_concreateComponent和方法SetDecorator(),comA.SetDecorator(com)执行的是:将comA父类的实例的变量concreateComponent赋值为com;

3.      comB继承自Decorator,所以comB类继承变量_concreateComponent和方法SetDecorator(),comB.SetDecorator(comA)执行的是:将comB父类的实例的变量concreateComponent赋值为comA;

4.  comB.Operation()执行步骤为:

a.  调用comB的Operation()方法,执行到comB的Operation方法的base.Operation()句时,就是执行DecoratorB的Operation()方法,该方法调用了DecoratorB的_concreateComponent变量,该变量在comB.SetDecorator(comA)中被赋予了值comA;

b.  调用comA的Operation()方法,执行到comA的Operation方法的base.Operation()句时,就是执行DecoratorA的Operation()方法,该方法调用了DecoratorA的_concreateComponent变量,该变量在comA.SetDecorator(com)中被赋予了值com;

c.  调用com的Operation()方法,输出ConcreateComponent,代码此时开始反向跳转,依次输出ConcreateDecoratorA和ConcreateDecoratorB


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值