设计模式学习笔记-基础知识篇

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375487.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内心的平静就是财富本身-Cell组件-用友华表的由来-T君

时至今日&#xff0c;Cell组件仍是应用广泛的商业报表组件 作者&#xff1a;人生三毒 编者注&#xff1a;本文作者人生三毒为知名网站及网页游戏公司创始人&#xff0c;此前曾为IT类媒体资深编辑&#xff0c;见证了中国互联网早期的发展。 认识T君之前先认识的是他的软件&#…

C++实现一个http服务器

一个简单的博客后端服务器 github地址&#xff0c;持续更新 设计参考 #define MYSQLPP_MYSQL_HEADERS_BURIED #include "httplib.h" #include "rapidjson/document.h" #include <mysql/mysql.h> #include <iostream> #include <string>…

KMP算法的java实现

package com.trs.utils;public class KMPStr {/** 在KMP算法中&#xff0c;最难求的就是next函数&#xff0c;如何理解next函数是一个难题&#xff0c;特别是knext[k]&#xff0c;这里* 需要指出的是当p[i]!p[j]时&#xff0c;我们只有通过回溯将k的值逐渐减小&#xff0c;貌似…

线段分割法实现微信抢红包

无意间看到的一种实现抢红包的方法&#xff0c;于是用C实现了一下。 将一个红包分成 n 份 具体的思路是&#xff0c;将一个红包看作是一个线段&#xff0c;线段的长就是红包总金额&#xff0c;然后在这个线段上随机切 n-1 刀&#xff0c;分成 n 份&#xff0c;然后抢红包的人依…

C++雪花算法实现

看来一下雪花算法的实现方法&#xff0c;用 c试着实现了一下&#xff0c;这里仅仅是实现了算法的流程&#xff0c;但是具体的细节&#xff0c;如并发、多线程访问等等没有具体考虑。 雪花算法的简单讲解参考 #include <sys/select.h> #include <iostream> #includ…

CAlayer层的属性

iOS开发UI篇—CAlayer层的属性 一、position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性&#xff1a;position和anchorPoint property CGPoint position; 用来设置CALayer在父层中的位置 以父层的左上角为原点(0, 0) property CGPoint anchorPoint; 称为“定位点”、…

Odoo9发行说明

2015年10月1日&#xff0c;期待已久的Odoo9正式发布。本文是Odoo9正式版发行说明&#xff0c;基于官网资料翻译。 译者: 苏州-微尘原文地址&#xff1a;https://www.odoo.com/page/odoo-9-release-notes译文地址&#xff1a;http://blog.csdn.net/wangnan537/article/details/4…

揭秘史上最完美一步到位的搭建Andoriod开发环境

Windows环境下Android开发环境搭建虽然不难而且网上资料众多&#xff0c;但是众多资料如出一折 忽略了很多细节&#xff0c;最终还是没能达到满意效果。 基本步骤如下&#xff1a;JDK安装、环境变量配置、Eclipse下载、AndoriodSDK下载安装、下载配置ADT但是到这里还不算完美搞…

【SQL】服务器环境下的SQL

一、大型数据库的三层体系结构 web服务器&#xff1a;比如在淘宝页面上&#xff0c;输入“牛肉干”&#xff0c;就是web服务器来处理&#xff0c;提交给应用服务器。 应用服务器&#xff1a;在获取到“牛肉干”这个请求后&#xff0c;应用服务器决定如何汇集结果&#xff0c;并…

即时聊天IM之二 openfire 整合现有系统用户

合肥程序员群&#xff1a;49313181。 合肥实名程序员群&#xff1a;128131462 (不愿透露姓名和信息者勿加入) Q Q:408365330 E-Mail:egojitqq.com 综述&#xff1a; 每天利用中午时间更新下这个知识点的的博客如果感兴趣的觉得更新慢了也别介意&#xff08;其它时间还是…

C#在ASP.NET4.5框架下的首次网页应用

运行效果预览: 先看实践应用要求: 1&#xff0e;编写一个函数&#xff0c;用于计算1&#xff01;2&#xff01;3&#xff01;4&#xff01;5&#xff01;&#xff0c;在控制台或页面输出运行结果。 2&#xff0e;在控制台或页面输出九九乘法表。 3&#xff0e;输入10个以内的整…

Android-Universal-Image-Loader三大组件DisplayImageOptions、ImageLoader、ImageLoaderConfiguration详解...

转 一、介绍 Android-Universal-Image-Loader是 一个开源的UI组件程序&#xff0c;该项目的目的是提供一个可重复使用的仪器为异步图像加载&#xff0c;缓存和显示。所以&#xff0c;如果你的程序里需要这个功能的话&#xff0c;那么不妨试试它。 因为已经封装好了一些类和方法…

Java小知识

内部类分为: 成员内部类、静态嵌套类、方法内部类、匿名内部类。(1)、内部类仍然是一个独立的类&#xff0c;在编译之后内部类会被编译成独立的.class文件&#xff0c;但是前面冠以外部类的类名和$符号。(2)、内部类不能用普通的方式访问。成员变量成员变量静态成员变量。List遍…

初识EL

一、EL函数库介绍 由于在JSP页面中显示数据时&#xff0c;经常需要对显示的字符串进行处理&#xff0c;SUN公司针对于一些常见处理定义了一套EL函数库供开发者使用。  这些EL函数在JSTL开发包中进行描述&#xff0c;因此在JSP页面中使用SUN公司的EL函数库&#xff0c;需要导入…

Scala学习笔记-环境搭建以及简单语法

关于环境的搭建&#xff0c;去官网下载JDK8和Scala的IDE就可以了&#xff0c;Scala的IDE是基于Eclipse的。 下面直接上代码&#xff1a; 这是项目目录&#xff1a; A是scala写的&#xff1a; package first import scala.collection.mutable.ListBufferobject A {def main(args…

UVa 12169 (枚举+扩展欧几里得) Disgruntled Judge

题意&#xff1a; 给出四个数T, a, b, x1,按公式生成序列 xi (a*xi-1 b) % 10001 (2 ≤ i ≤ 2T) 给出T和奇数项xi&#xff0c;输出偶数项xi 分析&#xff1a; 最简单的办法就是直接枚举a、b&#xff0c;看看与输入是否相符。 1 #include <cstdio>2 3 const int maxn …

【WCF安全】WCF 自定义授权[用户名+密码+x509证书]

1.x509证书制作(略) 2.直接贴代码 ----------------------------------------------------------------------服务端------------------------------------------------------------------------------------------- WCF服务 1 using System;2 using System.Collections.Generi…

ASP.NET Web API 数据提供系统相关类型及其关系

转载于:https://www.cnblogs.com/frankyou/p/4932651.html

openMVG跑自定义数据出错

使用自己拍摄的图片跑 openMVG 的 turtor_demo.py 时&#xff0c;出现错误&#xff0c;没有生成 sfm_data.bin DSC01988" model "DSC-RX100M6" doesnt exist in the database Please consider add your camera model and sensor width in the database.原因时数…

windows server 2003下安装iis6+php

参照http://www.myhack58.com/Article/sort099/sort0100/2012/35579.htm 这篇文章&#xff0c;即可&#xff01; 前 面我写了《windows安装PHP5.4Apache2.4Mysql5.5》的安装教程&#xff0c;本地实现是很简单的&#xff0c;但是有人还是喜欢用IIS来配置 PHP环境&#xff0c;部分…