装饰模式总结

引入装饰模式的目的

当我们进行某项工作时,需要进行不同事务或者功能之间的搭配,这些搭配会出现各种组合,而每个组合都要对应一个类,的时候我们就应该考虑应用装饰模型。

装饰模式的主要功能

有效的将类的核心职责和装饰功能区分开,而且去除相关中重复的装饰逻辑

对装饰模型中各个类功能的分析

装饰模型可以说是给特定的对象以特定的职能、特点、或者功能的的模式。
请看下面的UML图:
在这里插入图片描述
从上图中可以看到装饰模型中有三个主要的类:分别是Component、ConcreteComponent和Decorator;
这三个类中Component是一个接口,它的功能就是连接ConcreteComponent和Decorator。让Decorator类下的具体功能通过Component这个借口装备到ConcreteComponent这个具体的实例上
这就像我们电脑的主板和主板上的插件,我们的主板(ConcreteComponent)通过特定的插口(Component)装上特定的插件(Decorator)来完善或者提高电脑的性能。

下面我就演示一个例子,这个例子以人的打扮为例

第一步写接口

//写一个人类的接口,用来连接实例人还有装扮

 class Person
    {
       public Person ()
        { }


        private string _name;
        public Person (string name)
        {
            this._name = name;
        }


        public virtual void show()
        {
            Console.WriteLine("装扮的{0}",_name);

        }

    }
第二步实例化一个人
class PersonXiaoMing : Person

    {
        //string name = "";
        public PersonXiaoMing (string name):base(name)
        {
            //this.name = name;
        }
         

        public override void show()
        {
            //Console.WriteLine("装扮的{0}", name);
            base.show();
        }
    }
第三步添加装扮类
class Finery : Person
    {

        protected Person component;
        public void Decorate(Person component)
        {
            this.component = component;
        }


        public override void show()
        {
            if(component !=null)
            {
                component.show();
            }
        }
    }
第四步添加装扮的子类,也就是装扮的物件
class Tshirts:Finery 
    {
        public override void show()
        {
            Console.WriteLine("大T恤");
            base.show();
        }
    }
    class BigTrouser : Finery
    {
        public override void show()
        {
            Console.WriteLine("垮裤");
            base.show();
        }
    }
第五步客户端代码
            Person xm = new PersonXiaoMing("小明");
            Tshirts ts = new Tshirts();
            BigTrouser bt = new BigTrouser();

            ts.Decorate(xm);
            bt.Decorate(ts);
            bt.show();
            Console.Read();
客户端代码图解

首先实例化了三个类。这就不讲解了。
随后,ts调用Decorate方法,参数是xm实例;
在这里插入图片描述
代码实例化之后,调用方法分别对自身的字段进行了赋值。
最后bt调用show方法,显示“垮裤”,调用父类中的show方法,然后调用bt实例中的show方法,bt实例中的component=ts。
然后调用ts的show方法,显示“大T恤”,调用父类的show方法,然后调用ts实例中的show方法,ts实例中的component=xm。
然后调用xm的show方法,因为name为“小明”,所以显示“装扮的小明”

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值