一、当你的项目发现有如下问题之一时,就需要考虑重构代码,可能会有某种模式适合。

1、代码无法进行单元测试。

2、需求的变动总是导致代码的变动。

3、有重复代码的存在。

4、继承层次过多。

5、隐藏的依赖过多。

二、UML表示法

1、UML类图

"+"代表Public,“#”代表protected,“-”代表private,即代表变量 public string Prol;  代表方法 public void Method1(){  }

2、UML序列图

序列图描述系统的动态交互过程,在序列图中,垂直虚线叫做“生命线”,代表一个对象的生存周期,每一个箭头代表一个调用,

在生命线上若有空心条,代表调用的激活周期,成为激活条。

三、系统的可维护性包括如下几个方面:

1、可扩展性:有了新的需求,新的性能可以容易地添加到系统中,并且不影响现有的性能,也不会带来新的缺陷。

2、可修改性:系统某一部分的代码需要修改时不会破坏系统现有的结构,也不会影响到其他部分。

3、可替换性:可以将系统中的某些类替换为相同接口的其他类,并且系统不受影响。

四、“开-闭”原则:

指软件实体应当对扩展开放,对修改关闭,即软件实体应该在不修改的前提下扩展。

五、封装变化

程序中任何可能发生变化的部分都可以封装为对象,包括命令、事件、属性、算法、形态等。

封装变化是实现“开-闭”原则的重要手段,也是在设计中发现对象的重要途径。

因此在分析需求时,一定要注意什么是变的,什么是可能发生变化的,以及这些可能的变化会对封装带来的影响。

六、面向接口编程的优势:

1、降低程序各部分之间的耦合性,使程序模块互换成为可能。这样客户无需知道自己使用的对象类型,只要对象有客户所期望的接口即可。

并且对象也不需要知道对象是如何实现的,只要知道定义接口的抽象类。

2、使软件各部分便于单元测试,通过编制与接口一致的模拟类(Mock),可以很容易地实现软件各部分的单元测试。从而提高软件的可靠性,降低错误率。

3、易于实现软件模块的互换,软件升级时可以只部署发生变化的部分,而不会影响其他部分。

七、继承的缺点

1、继承在编译时定义,无法在运行时改变,无法在运行时动态的选择继承或者不继承某一个类。

2、继承对子类暴露了父类的实现细节,从而破坏了封装性。

3、子类和父类耦合性非常强,一旦父类发生变化,必然导致子类也发生变化。

八、设计模式解决的问题

问题 设计模式 描述
通过显示指定类创建对象 抽象工厂模式、工厂方法模式、原型模式 在实例化时,间接创建对象
紧耦合 抽象工厂模式、命令模式、外观模式、中介者模式、观察者模式和职责链模式等 类之间需松耦合
通过生成子类扩展功能 桥接模式、职责链模式、组合模式、装饰模式、观察者模式、策略模式等

通过生成子类来扩展功能会产生很多问题,如引起子类数量大量增加和类层次的增加。

通过对象组合技术实现功能扩展是更好的选择

对对象表示或实现的依赖 抽象工厂模式、桥接模式、备忘录模式、代理模式等 对客户隐藏对象如何表示、保存、定位或实现等。
不能方便地修改类 适配器模式、装饰模式、访问者模式  
对算法的依赖 生成器模式、迭代器模式、策略模式、模板模式、访问者模式 算法实现的目的是不变的,但算法本身却不是一成不变的
对软硬件环境的依赖 抽象工厂模式、桥接模式等  

九、设计模式所用到的接口和类(.NET)

接口/类 设计模式 描述
ICloneable 原型模式 这个接口支持克隆,即创建与当前实例相同的实例,方法为Clone()
IEnumerable/IEnumerator 迭代子模式 公开枚举数支持在集合上进行简单迭代
MenuCommand类/IMenuCommandService 命令模式 提供了对自定义组件行为的基类
CollectionBase类 组合模式、命令模式、享元模式、观察者模式 CollectionBase是强制类型集合的基类,通过实现这个类可以实现强制类型
IDataAdapter 适配器模式

IDataAdapter定义了数据库与DataSet之间的桥接器,

针对不同的数据源的DataAdapter瞌睡实现程序与数据源的松耦合

十、设计模式的分类

1、创建型模式

通过一个专门实例化的类来获得具体的对象,通常我们将称这个类为“工厂”,将与实例化相关的模式称为“创建型模式”。

Unity C# 关于设计模式的思考的更多相关文章

  1. Unity 3D观察者设计模式-C#委托和事件的运用

    C#观察者设计模式 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心创新! ...

  2. [New learn] 设计模式思考

    本文是对上文[New learn] 设计模式的思考总结 1.大框架 无论应用使用多少种设计模式和技巧,此模式都是应用的大框架.下图为本项目的基本架构图: 1.上图中大框架为经典的MVC模式. 2.Co ...

  3. Erich Gamma

    Erich Gamma是IBM的杰出工程师.他是Jazz项目的领头人之一,曾担任Eclipse的Java开发环境JDT项目的领导,目前是Eclipse的项目管理委员会成员.Erich也是经典书籍< ...

  4. 三种工厂模式的分析以及C++实现

    三种工厂模式的分析以及C++实现 以下是我自己学习设计模式的思考总结. 简单工厂模式 简单工厂模式是工厂模式中最简单的一种,他可以用比较简单的方式隐藏创建对象的细节,一般只需要告诉工厂类所需要的类型, ...

  5. Rest_framework Serializer 序列化 (含源码浅解序列化过程)

    目录 Rest_framework Serializer 序列化 序列化与反序列化中不得不说的感情纠葛 三角恋之 save/update/create 四角恋之 序列化参数instance/data/ ...

  6. 【WPF】 Behavior

    Hello,Behavior   引言         在看PDC-09大会的视频时,其中一篇讲利用Blend来扩展Silverlight元素的行 为,当时感觉很酷:在Blend中,将MouseDra ...

  7. 让我们彻底看清MVC、MVP

    这里開始记录下来自己对MVC.MVP.MVVM这三种框架模式的理解,本文从以下几个方面来梳理. 架构的目的 框架模式.设计模式 MVC设计的介绍 MVC在Android中的应用 MVC该怎样设计 MV ...

  8. 从字节跳动离职后,拿到探探、趣头条、爱奇艺、小红书、15家公司的 offer【转】

    前言 博主目前从事Android开发3年,前两年一直在抖音工作.我这篇文章并不是简单的描述一些面试中的题,或者总结一些Android的知识,而是想记录我整个的想法和准备的过程,以及一些心得体会,让大家 ...

  9. abp.zero 9.0框架的前端Angular使用说明

    abp.zero 9.0框架的前端Angular使用说明 目录 abp.zero 9.0框架的前端Angular使用说明 摘要 1 部署及启动 1.1 依赖包安装 1.2 使用yarn安装依赖包 1. ...

随机推荐

  1. 【原创】Apache和Tomcat实现动静分离

    集群中每个节点都启用了页面静态化功能,所以,为了防止单个节点刷新造成找不到页面问题,将每个节点刷新的页面都放入apache虚拟目录下,由apache统一来处理.静态页面由apache处理,动态页面仍然 ...

  2. angular.js学习-ng-grid

    ng-grid是基于AngularJS和JQuery的富表格控件,由AngularUI Team领衔开发,到目前为止已有2354次Commit,1076个Fork.  AngualrUI:http:/ ...

  3. How Javascript works (Javascript工作原理) (二) 引擎,运行时,如何在 V8 引擎中书写最优代码的 5 条小技巧

    个人总结: 一个Javascript引擎由一个标准解释程序,或者即时编译器来实现. 解释器(Interpreter): 解释一行,执行一行. 编译器(Compiler): 全部编译成机器码,统一执行. ...

  4. 洛谷1345 [Usaco5.4]奶牛的电信

    题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相 ...

  5. list 分页

    package com.jsz.peini.common.util; import java.util.ArrayList; import java.util.List; public class S ...

  6. 【Computer Vision】角点检测和匹配——Harris算子

    一.基本概念 角点corner:可以将角点看做两个边缘的交叉处,在两个方向上都有较大的变化.具体可由下图中分辨出来: 兴趣点interest point:兴趣点是图像中能够较鲁棒的检测出来的点,它不仅 ...

  7. PHP中比较有用的几个函数

    php_check_syntax 这个函数可以用来检查特定文件中的PHP语法是否正确. highlight_string 当你想要把PHP代码显示到页面上时,highlight_string()函数就 ...

  8. LaTeX 简介与安装

    1 LaTeX 简介 Leslie Lamport 开发的 LaTeX 是当今世界上最流行和使用最为广泛的TeX格式.它构筑在Plain TeX的基础之上,并加进了很多的功能以使得使用者可以更为方便的 ...

  9. 推断扫描后的内容是否是URL

    扫描的明明是Url.竟然当文本给处理了,看来正则没有通过. 扫描二维码后,我參考了QQ的效果.分了三种:网页地址.文件下载地址,文本信息:为了实现这样的效果.我 发现有非常多url非常奇葩.所以就想找 ...

  10. hdu5137 How Many Maos Does the Guanxi Worth(单源最短路径)

    题目链接:pid=5137">点击打开链接 题目描写叙述:如今有一张关系网.网中有n个结点标号为1-n.有m个关系,每一个关系之间有一个权值.问从2-n-1中随意去掉一个结点之后,从1 ...