.net设计模式-装饰器模式
时间:2019-09-09
本文章向大家介绍.net设计模式-装饰器模式,主要包括.net设计模式-装饰器模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
结构型设计模式:关注类与类之间的关系
装饰器模式:用组合+继承的方式对类作出扩展,可以动态为类型添加功能,甚至调整功能顺序,不修改业务类;
一个抽象类
1 public abstract class AbstractStudent 2 { 3 public int Id { get; set; } 4 public string Name { get; set; } 5 6 public abstract void Study(); 7 }
组合+继承该抽象类
1 public class BaseStudentDecorator : AbstractStudent 2 { 3 private AbstractStudent _Student = null;//用了组合加override 4 public BaseStudentDecorator(AbstractStudent student) 5 { 6 this._Student = student; 7 } 8 9 public override void Study() 10 { 11 this._Student.Study(); 12 Console.WriteLine("****************"); 13 //基类装饰器必须是个空的行为 会重复 14 } 15 }
调用,衍变
1 AbstractStudent student = new StudentVip() 2 { 3 Id = 1234, 4 Name = "oldkwok" 5 }; 6 //BaseStudentDecorator baseStudentDecorator = new BaseStudentDecorator(student);//1 7 //AbstractStudent baseStudentDecorator = new BaseStudentDecorator(student);//2 8 //student = new BaseStudentDecorator(student);//3
像适配器或者是代码模式那样,想对一个类作出扩展可以分为继承和组合两种方式
1.继承:虽然调用的时候只用到了一个类,但是功能单一
2.组合:虽然可以作出足够多的扩展(组合多种类),但是调用的时候需要初始化代理类和原始类两个类
装饰器模式结合了两者的优点:1.调用的时候只创建属于基类实现的类,2.可作出扩展
添加的功能能够累加
1 StudentHomeworkDecorator(student);//3 2 student = new StudentCommentDecorator(student); 3 student = new StudentHomeworkDecorator(student);//4 4 5 //student = new StudentCommentDecorator(student); 6 //不修改业务类,可以随意的添加功能 装饰器 7 //还可以随意调整顺序
上面代码相当于加一个装饰器就增加一个功能,传入一个,获得返回值,并传入下一个装饰器,得到更强(功能更多)的类,可以理解为向事件中加入方法
原文地址:https://www.cnblogs.com/Spinoza/p/11494954.html
- Android实现TCP断点上传,后台C#服务实现接收
- Android如何制作漂亮的自适布局的键盘
- 实用收藏Linux命令备忘
- 0基础搭建Hadoop大数据处理-环境
- 如何实现两台服务器间无密码的传输数据和操作
- 一步到位Linux中安装配置MySQL及补坑
- 我是如何处理大并发量订单处理的 KafKa部署总结
- 一步到位分布式开发Zookeeper实现集群管理
- 备胎的养成记KeepAlived实现热备负载
- 0基础搭建Hadoop大数据处理-初识
- 入坑系列之HAProxy负载均衡
- 如何开发自己的搜索帝国之Elasticsearch
- NET中解决KafKa多线程发送多主题的问题
- mysql数据与Hadoop之间导入导出之Sqoop实例
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Flink实战教程-自定义函数之标量函数
- Flink实战教程-自定义函数之TableFunction
- Flink教程-flink 1.11 流式数据ORC格式写入file
- Flink教程-使用sql将流式数据写入文件系统
- flink教程-flink 1.11 集成zeppelin实现简易实时计算平台
- flink教程-详解flink 1.11 中的CDC (Change Data Capture)
- flink教程-基于flink 1.11 使 sql客户端支持执行sql文件
- flink教程-详解flink 1.11 中的JDBC Catalog
- flink教程-flink modules详解之使用hive函数
- 面试iOS 机会在自己手中
- Flink教程-将流式数据写入redis
- Flink教程-keyby 窗口数据倾斜的优化
- Flink源码分析之深度解读流式数据写入hive
- 浙大版《C语言程序设计(第3版)》题目集 习题10-1 判断满足条件的三位数
- 差分标记-HDU1556 Color the ball