装饰者设计模式
来源:互联网 发布: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
- 装饰者设计模式
- 设计模式 - 装饰者
- 装饰者设计模式
- 装饰者设计模式
- 装饰者设计模式
- 装饰者设计模式
- 装饰者设计模式
- 装饰者设计模式
- 装饰者设计模式
- 装饰者设计模式
- 装饰者设计模式
- 装饰者设计模式
- 装饰者设计模式
- 装饰者设计模式
- 装饰者设计模式
- 装饰者设计模式
- 装饰者设计模式
- 装饰者设计模式
- linux内核分析——CFS调度器
- iOS:Button.titleLabel.text
- Unable to resolve target 'Google Inc.:Google APIs和Open the Java build path property page of project
- HDU 1789:Doing Homework again
- maven pom编写
- 装饰者设计模式
- KMP算法和KMP算法中next数组的讲解
- Android 开发优化 知识点
- adb 常用命令使用+adb 无线调试
- 读书笔记MoreEffectiveC++(21)
- UVA 514 Rails(栈)
- Tree's a Crowd
- linux内核__get_free_page,kmalloc,vmalloc的区别,内核对内存的管理
- HDU 1236 排名