装饰者设计模式

来源:互联网 发布:php如何检测usbkey 编辑:程序博客网 时间:2024/05/23 19:18

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


参与类或接口作用

  ConcreteComponent让Decorator对象为自己添加功能。有时候使用ConcreteComponent的派生类提供核心功能,在这种情况就是用ConcreteComponent替代了Component的功能,而且装饰者是继承于ConcreteComponent的子类。

  Component定义ConcreteComponent和Decorator类要实现的方法,简单来说如果一个类继承于该类就具有装饰或被装饰能力。 

  Decorator具有特定装饰功能的类,用来装饰ConcreteComponent类。

代码故事:小学上学都有成绩单,有成绩单就要求有家长签字。考好了一切没问题,如果考差了,还敢让家长签字么?这个时候就要想个办法了:要装饰一下我们的成绩单,让家长看起来这个成绩还不错。具体代码如下:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace WCF_Binding{    //抽象成绩单    public abstract class SchoolReport    {        //成绩单主要展示的就是你的成绩情况        public abstract void report();        //成绩单要家长签字,这个是最要命的        public abstract void sign(String name);    }    //四年级成绩单    public class FouthGradeSchoolReport : SchoolReport    {        //我的成绩单        public override void report()        {            //成绩单的格式是这个样子的            Console.Write("尊敬的XXX家长:");            Console.Write(" ......");            Console.Write(" 语文 62 数学65 体育 98 自然 63");            Console.Write(" .......");            Console.Write(" 家长签名: ");        }        //家长签名        public override void sign(String name)        {            Console.Write("家长签名为:" + name);        }    }    //修饰的抽象类    public abstract class Decorator : SchoolReport    {        //首先我要知道是哪个成绩单        private SchoolReport sr;        //构造函数,传递成绩单过来        public Decorator(SchoolReport sr)        {            this.sr = sr;        }        //成绩单还是要被看到的        public override void report()        {            this.sr.report();        }        //看完还是要签名的        public override void sign(String name)        {            this.sr.sign(name);        }    }    //最高成绩修饰    public class HighScoreDecorator : Decorator    {        //构造函数        public HighScoreDecorator(SchoolReport sr):base(sr)        {        }        //我要汇报最高成绩        private void reportHighScore()        {            Console.Write("这次考试语文最高是75,数学是78,自然是80");        }        //我要在老爸看成绩单前告诉他最高成绩,否则等他一看,就抡起扫帚揍我,我哪里还有机会说啊        public override void report()        {            this.reportHighScore();            base.report();        }    }    //排名情况修饰    public class SortDecorator : Decorator    {        //构造函数        public SortDecorator(SchoolReport sr):base(sr)        {        }        //告诉老爸学校的排名情况        private void reportSort()        {            Console.Write("我是排名第38名...");        }        //老爸看完成绩单后再告诉他,加强作用        public override void report()        {            base.report();            this.reportSort();        }    }    public class Father    {        public static void main(String[] args)        {            //把成绩单拿过来            SchoolReport sr;            //原装的成绩单            sr = new FouthGradeSchoolReport();            //加了最高分说明的成绩单            sr = new HighScoreDecorator(sr);            //又加了成绩排名的说明            sr = new SortDecorator(sr);            //看成绩单            sr.report();            //然后老爸一看,很开心,就签名了            sr.sign("老三"); //我叫小三,老爸当然叫老三        }    }}


0 0