码迷,mamicode.com
首页 > 其他好文 > 详细

装饰模式

时间:2018-05-21 01:02:56      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:代码   rri   定义   style   har   decorator   oid   chinese   中国   

定义:装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能

例子:假设现在有个中国人要体现出他会说英文和日文,这时候怎么办?

  public abstract class People 
    {
        public abstract void Say();
    }
    public class Chinese : People
    {
        public override void Say()
        {
            Console.WriteLine("我是中国人");
        }
    }

如果体现说日文的话,要重新再写一个子类,如果是N个就要写N个子类,显得不合理。

改造

  public abstract class People
    {
        public abstract void say();
    }

    public class Chinese : People
    {
        public override void say()
        {
            Console.WriteLine("我是中国人");
        }
    }

    public abstract class Decorator : People
    {
        public People people;
        public Decorator(People p)
        {
            this.people = p;
        }

        public override void say()
        {
            people.say();          
        }
    }

    public class English : Decorator
    {
        public English(People p) : base(p)
        {
        }
        public override void say()
        {
            base.say();
            //新的行为
            SayEnglish();
        }

        public void SayEnglish()
        {
            Console.WriteLine("我会讲英语");
        }
    }

    public class Jan : Decorator
    {
        public Jan(People p) : base(p)  
        {
        }

        public override void say()
        {
            base.say();
            SayJan();
        }

        public void SayJan()
        {
            Console.WriteLine("我会讲日文");
        }
    }

发现使用装饰模式可以减少类的实现,也可以实现代码组合:例如:

Jan j = new Jan(new English(new Chinese()));
            j.say();

English它继承了Decorator类又构造了people,我们实例化Englist也会传入一个抽象people(创建中国人的实例)进来,这样我们就可以调用Say和SayEnglish方

由此可见:装饰模式的好处:当系统需要有新的功能的时候,向旧的类添加新的代码,新加的代码往往会装饰原来类的核心职责和主要行为。

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

 


 

装饰模式

标签:代码   rri   定义   style   har   decorator   oid   chinese   中国   

原文地址:https://www.cnblogs.com/liu23/p/9065195.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!