衣服还要一件一件穿——装饰模式

简介: 1.定义  装饰模式(Decorator),动态的给对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。2.理解  装饰模式其实就是对对象进行包装,达到每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中。

1.定义

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

2.理解

  装饰模式其实就是对对象进行包装,达到每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中。就好比穿裤子的时候你只把裤子穿好就行,不用关心内裤是怎么穿上的。下面还是用小菜的例子来讲解吧:

3.实例

  首先建立一个Person类

  

 class Person
    {
        public Person()
        { }
        private string name;
        public Person(string name)
        {
            this.name = name;
        }
        public virtual void Show()
        {
            Console.WriteLine("装扮的{0}", name);
        }
    }
  然后再建立一个服饰类,让服饰类继承Person类

 //服饰类
    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.Write("大T恤");
            base.Show();
        }
    }
    class BigTrouser : Finery
    {
        public override void Show()
        {
            Console.Write("垮裤");
            base.Show();
        }
    }
    class WearSneakers : Finery
    {
        public override void Show()
        {
            Console.Write("破球鞋");
            base.Show();
        }
    }
    class WearSuit : Finery
    {
        public override void Show()
        {
            Console.Write("西装");
            base.Show();
        }
    }
    class WearTie : Finery
    {
        public override void Show()
        {
            Console.Write("领带");
            base.Show();
        }
    }
    class WearLeatherShoes : Finery
    {
        public override void Show()
        {
            Console.Write("皮鞋");
            base.Show();
        }
    }

  最后就可以给小菜穿衣服了

static void Main(string[] args)
        {
            Person xc = new Person("小菜");//给xc赋初值为小菜
            Console.WriteLine("\n第一种装扮");
            WearSneakers pqx = new WearSneakers()//用破球鞋的装饰方法
            BigTrouser kk = new BigTrouser();//调用垮裤的装饰方法
            TShirts dtx = new TShirts();//调用大T桖的装饰方法
            pqx.Decorate(xc);//给小菜穿上破球鞋
            kk.Decorate(pqx);//给穿着破球鞋的小菜穿上垮裤
            dtx.Decorate(kk);//给穿着垮裤破球鞋的小菜穿上大T桖
            dtx.Show();
            Console.Read();
        }

  注意这里就是在给小菜穿垮裤的时候不用关心破球鞋是怎么穿上的,同样穿大T桖的时候不用关心垮裤是怎么穿上的。这样在写代码的时候就能有效地把类的核心职责和装饰功能区分开了,而且可以去除类中重复的装饰逻辑。再想想穿衣服的时候一件一件穿是不是比裤子T桖同时速度要快呢?

目录
相关文章
|
Java 程序员
IT学不好没什么,大不了躺平
IT学不好没什么,大不了躺平
|
存储 编译器 Linux
类和对象(跑路人笔记)<完>(1)
类和对象(跑路人笔记)<完>
类和对象(跑路人笔记)<完>(1)
|
存储 编译器 C++
类和对象(跑路人笔记)<完>(3)
类和对象(跑路人笔记)<完>
类和对象(跑路人笔记)<完>(3)
|
编译器
类和对象(跑路人笔记)<完>(4)
类和对象(跑路人笔记)<完>
类和对象(跑路人笔记)<完>(4)
|
编译器 C++
类和对象(跑路人笔记)<完>(2)
类和对象(跑路人笔记)<完>
类和对象(跑路人笔记)<完>(2)
|
Web App开发 程序员
一件事:做得好,还是做得快?
前段时间读 Jeff Atwood 的一篇博客,里面有一段话说得蛮好的:“沿着那条路冲下去,一定要快,如果有什么挡住了去路,绕开它。” 这段话的弦外之音就是在说:做一件事,不要刻意追求完美、极致,而是要追求快速地迭代。 大家都知道,Google Chrome 浏览器的迭代速度非常快,截个图大家感受一下(这些都是 release 的正式版本)。版本号用了 9 位数字表示,可想而知迭代的频率有多快。
一件事:做得好,还是做得快?
|
Python 机器学习/深度学习
听过很多道理,依然过不好这一生?
网上有一个经典的段子“听过很多道理,依然过不好这一生”。同样的道理我们也可以问问自己“学过这么多年英语,依然开不了口”,“看了这么多书,依然编不了程序”。
1089 0
记一件傻事
春运过年,都要抢票回家,我也要抢票。早上醒来的时候就记得要抢票,一直到了公司还记得这事,早上8点钟开始抢票。 什么事情? 还没到8点钟呢,我想试试能不能再12306上购买,结果发现可以购买。