zoukankan      html  css  js  c++  java
  • 装饰模式

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

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

      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方

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

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

    
    
    
  • 相关阅读:
    Java批量文件打包下载
    Java Swing
    空白文章
    linux 用户创建、管理、权限分配
    在虚拟机下安装hadoop集成环境(centos7+hadoop-2.6.4+jdk-7u79)
    《转载》POI导出excel日期格式
    java导出生成word(类似简历导出)
    《sqoop实现hdfs中的数据导出至mysql数据库》
    c# winform 自动关闭messagebox 模拟回车
    Ubuntu下启动/重启/停止apache服务器
  • 原文地址:https://www.cnblogs.com/liu23/p/9065195.html
Copyright © 2011-2022 走看看