装饰模式

Posted liu23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰模式相关的知识,希望对你有一定的参考价值。

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

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

  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方

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

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

 


 

以上是关于装饰模式的主要内容,如果未能解决你的问题,请参考以下文章

Thymeleaf 模板 - 有没有办法装饰模板而不是包含模板片段?

swift设计模式学习 - 装饰模式代码大全

设计模式---装饰者模式

设计模式之单例模式

装饰模式与代理模式的区别

Java设计模式之装饰者模式