设计模式学习笔记-基础知识篇
1. 设计模式的重要性
1.1 设计模式解决的是在软件过程中如何来实现具体的软件功能。实现同一个功能的方法有很多,哪个设计容易扩展,容易复用,松耦合,可维护?设计模式指导我们找到最优方案。
1.2 设计中往往会存在设计缺陷,这些缺陷包括:
僵化性:难以对软件进行改动,即使在功能上来看是很小的改动
脆弱性:在进行很小的改动时,可能导致很多地方出现问题
顽固性:要把系统中某些通用的功能分离出来的努力和风险非常巨大
粘滞性:当面临改动时,改动的方案有很多,一些会保持设计,一些会破坏设计,当采用保持设计的方法比用破坏设计的方法更难应付变化时,说明原设计具有较高的粘滞性
晦涩性:模块难以理解
不必要的重复:代码不能复用,往往通过Copy-Paste来实现相似功能
不必要的复杂性:设计中包含了没有用的成分,往往是过度设计导致的
1.3 如果你觉得在开发过程中发现以上问题(缺陷),那么就需要使用设计模式来改善最初设计,即重构原有的设计。如果你是最初的设计者,那么也需要应用设计模式来找到一个最优方案。设计模式不是编程语言,它修炼的是程序员的内功。因此,对于一个开发者来说,学习设计模式是非常必要的。
2. 对于初学者来说,必要的知识准备还是必须的,没有这些基础就很难将这些理解透彻。
2.1 面向对象基本知识
设计模式是面向对象编程的设计指导,因此学习设计模式前先要理解什么是面向对象,这里只简单列出了面向对象的主要概念,要是初学者的话还得查阅相关资料;对已经了解的老手来说,权当复习和梳理一下吧。
2.1.1 面向对象三大特征:封装、继承、多态
2.1.2 类与实例
2.1.3 构造(析构)方法
2.1.4 重载
2.1.5 访问修饰符
2.1.6 属性/字段/方法
2.1.7 抽象类
2.1.8 接口
2.2 UML类图
在学习设计模式时,通常接触到的只有类图,因此读懂UML类图对理解模式来说有很大帮助。下面来介绍UML类图中的关系
2.2.1 依赖关系(Dependency),用虚线加箭头表示。如上图动物(Animal)依赖空气(Air)。表示依赖关系的代码有以下几种
1)作为参数
public class Air{public void GetOxygen() { Console.WriteLine("Get oxygen from air."); } } public abstract class Animal { /// <summary> /// 动物依赖空气才能呼吸,作为参数传入 /// </summary> /// <param name="air"></param> public void Breathe(Air air) { air.GetOxygen(); } }
2)在方法内部定义
/// <summary>/// 动物依赖空气才能呼吸,在方法内部实例化新对象/// </summary> public void Breathe() { Air air = new Air(); air.GetOxygen(); }
3)静态方法调用
/// <summary>/// 在方法中调用静态方法/// </summary> public void Test() { ClassName.UseStaticMethode(); }
2.2.2 继承关系(Inherit),用实线加空心箭头表示,如上图鹰(Eagle)继承自动物(Animal)
/// <summary>/// 鹰继承自Animal/// </summary> public class Eagle : Animal { }
2.2.3 实现关系(Realize),用虚线加空心箭头表示,如上图鹰(Eagle)实现了飞行能力(IFlyAble)
/// <summary>/// 鹰继承自Animal/// </summary> public class Eagle : Animal, IFlyAble { //实现IFlyAble接口中定义的方法 public void Fly() { Console.WriteLine("老鹰可以飞翔。"); } }
2.2.4 组合关系,讲组合关系之前不得不谈关联关系与聚合关系
1)关联关系(Association):对于两个相对独立的对象,当一个对象实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间的关系为关联关系。例如:公司与员工的关系
代码表现,通过实例字段或属性来实现
public class Emplolyee{public string Name{ get; set; }}public class Company { /// <summary> /// 一个公司可以有多个员工 /// </summary> private Emplolyee[] employees; }
2) 聚合关系(Aggregate): 是关联关系的一种,是一种较强的关联关系,强调整体与部分之间的关系。例如:电脑与显示器的关系,就是整体与部分的关系,即聚合关系
代码表现,也是通过实例字段或属性来实现
public class Displayer{/// <summary>/// 显示器型号 /// </summary> public string Model { get; set; } } public class Computer { /// <summary> /// 通过字段表示聚合关系 /// </summary> private Displayer displayer; }
3)组合关系,组合关系是聚合的一种特殊形式,表示一个所有物实例不能同时被两个所有物所拥有。如上例:鹰拥有一对翅膀,它的翅膀不能同时属于别的鹰。
代码表现,也是通过实例字段或属性来实现
public class Wing{}/// <summary>/// 鹰继承自Animal /// </summary> public class Eagle : Animal, IFlyAble { private Wing leftWing; private Wing rightWing; public Eagle() { // 在构造函数中实例化翅膀,防止翅膀被改变 leftWing = new Wing(); rightWing = new Wing(); } public void Fly() { Console.WriteLine("老鹰可以飞翔。"); } }
关联关系与聚合关系的区别: 关联关系所涉及的两个对象是处在同一个层次上的,比如程序员和计算机的关系就是一种关联关系,而不是聚合关系,因为程序员不是由计算机组成的。聚合关系涉 及的两个对象处于不平等的层次上,一个代表整体,一个代表部分。如计算机与显示器的关系就是聚集关系,因为显示器是计算机的一部分。
聚合关系与组合关系的区别:聚合关系中处于被持有的对象,可以被别的对象所持有。如多态计算机可以共享同一个显示器。组合关系中被持有的对象只能被一个对象引用,不能共享给其它对象;而且被持有的对象的生命周期也由所有者控制,当所有者析构了,其所有物必须随着它一起析构。
转载于:https://www.cnblogs.com/fly1027/p/4866366.html
设计模式学习笔记-基础知识篇相关推荐
- Hadoop学习笔记—15.HBase框架学习(基础知识篇)
Hadoop学习笔记-15.HBase框架学习(基础知识篇) HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase ...
- 设计模式学习笔记(目录篇)
设计模式学习笔记(目录篇) 为了方便查看,特此将设计模式学习笔记系列单独做一个目录. 1 设计模式学习笔记(一:命令模式) 2 设计模式学习笔记(二:观察者模式) 3 设计模式学习笔记(三 ...
- 经典再现,看到就是赚到。尚硅谷雷神 - SpringBoot 2.x 学习笔记 - 基础入门篇
SpringBoot 2.x 时代 – 基础入门篇 视频学习地址:https://www.bilibili.com/video/BV1Et411Y7tQ?p=112&spm_id_from=p ...
- go get 拉取指定版本_go语言学习笔记-基础知识-3
相关文档 go语言学习笔记-目录 1.简介 1.1 什么是GO Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易.Go是从2007年末由Robert Griesemer, Rob ...
- java学习笔记-基础知识-2023.3.29
学习网站:https://www.sxt.cn/Java_jQuery_in_action/History_Direction.html 刷题网站 牛客网专题-spring java sql 第一章 ...
- Cracer渗透视频课程学习笔记——基础知识(1)
常见的术语介绍 脚本(asp,php,jsp):可以编写动态网站的,浏览器右击查看不到,只能看到静态代码. html(css,js,html):解释语言,静态的,浏览器右击查看源码可以看到 HTTP协 ...
- mysql 实战 45讲 学习笔记 基础知识 原理剖析
MySQL 实战45讲 持续更新中~ 00讲 开篇 我们知道如何写出逻辑正确的SQL语句来实现业务目标,却不确定这个语句是不是最优的 我们听说了一些使用数据库的最佳实践,但是更想了解为什么这么做 我们 ...
- 设计模式学习笔记(总结篇:模式分类)
GOF根据模式的目标将模式分为三个类目:创建型.行为型和结构型. 1 创建型模式 创建型模式设计对象的实例化,这类模式的特点是,不让用户依赖于对象的创建或排列方式,避免用户直接使用new运算符创建对象 ...
- Validform 学习笔记---基础知识整理
面对表单的验证,自己写大量的js毕竟不是一个明智的做法.不仅仅是代码很长而且不便于梳理.Validform就是一款开源的第三方验证js的控件,通过添加相应的js以及css能够有效的验证表单,维护起来也 ...
最新文章
- 【NOI2019十二省联合省选】部分题简要题解
- 局域网内计算机可以互访 无法上互联网,我使用路由器后访问互联网正常,但是网上邻居不能互访,怎么办?...
- linux批量修改压缩图片大小,linux shell批量压缩某个目录下图片大小
- Django模型层(models.py)之多表操作
- 人工神经网络心得体会_卷积神经网络学习心得
- Linux的命令之 man -- 查看帮助文档
- 应用层的信令控制协议 SIP
- ddos攻击数据集_ddos攻击和cc攻击有什么区别?他们2个哪个更厉害?
- Spring中实现自定义事件
- 东哥再见!我打算 6 月份离职
- 第四章 类中数据的共享和保护
- 机器学习之协方差矩阵、黑塞矩阵、标准差椭圆和EM算法
- vue 城市级联选择 distPicker
- 中艺人脸识别考勤机使用方法_M2人脸识别考勤机使用说明
- html5个性音乐播放器,9款优秀HTML5音乐播放器 - 米扑博客
- 常用物流快递单号自动识别api接口-快递鸟对接
- 第一次尝试使用Python创建季节性ARIMA模型
- 【Python中字典的len()方法】
- 刚入职一个月的程序猿
- android studio便签需求介绍,Android我的便签-----SQLite的使用方法