设计模式
结合个人编程经验,用C#语言简单介绍描述23种设计模式及面向对象编程原则。
杨友山
多年软件开发管理经验,曾在腾讯、中兴通讯等企业从事软件开发和管理工作,熟悉技术和开发管理;曾在微软从事售前技术支持,接触过产品销售。目前在从事低代码平台类产品研发相关工作。 擅长.NET领域,前端angular,vue,typescript,Oracle,云计算相关。
展开
-
读书笔记22:职责链模式
1、定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到对象处理它为止。 相信大家都写过if...else或者switch,当条件很多时需要写上数十行代码。如果要修改某些条件或者处理过程,就又要不断地修改这个牛叉的分支语句。这时我们可以采用职责链模式,它是将许多请求的分支或者步骤都独立出来。然后每个独立出来的部分原创 2012-03-26 16:53:15 · 1969 阅读 · 2 评论 -
读书笔记21:解释器模式
1、定义 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。该模式很好理解就是,目的就是解释。比如说世界上的各个地区和国家的汉字各不相同,但是需要表达的意思是相同的。同样描述吃饭的,中国叫吃饭,老外叫Eat...所以解释器模式是指,在程序中,一些符号或字符等需要在特定的条件下解释成这样,在另一情况下解释成那样。2、角色这个模式角色原创 2012-03-19 15:49:39 · 1778 阅读 · 0 评论 -
读书笔记20:中介者模式
1、 定义:用一个中介对象来封装一系列的对象交互。中介者使个对象不需要显示地相互引用,从而使其耦合松散而且可以独立地改变它们之间的交互。 中介者减少了各个同事对象的耦合,使得可以独立地改变和复用各个同事对象和中介者类;由于把对想如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到他们之间的交互上来,也就是站在一个更宏伟的角度去考虑原创 2012-03-16 10:59:58 · 1587 阅读 · 0 评论 -
读书笔记19:访问者模式
1、定义:表示作用于某对象结构中的个元素的操作。它使你可以在不改变个元素的类的前提下定义作用于这些元素的新操作。2、角色:抽象访问者角色(Visitor):声明了一个或者多个访问操作,形成所有的具体元素角色必须实现的接口。 具体访问者角色(CreateVisitor):实现抽象访问者角色所声明的接口,也就是抽象访问者所声明的各个访问操作。 抽象节点角色(Element):声明一个接原创 2012-03-14 15:31:59 · 1825 阅读 · 0 评论 -
面向对象设计原则详解:迪米特法则
定义:如果两个类不必彼此通信,那么这两个类就不应该发生直接的相互作用。如果其中一个类需要调用另一个类的某个方法,可以通过第三者转发这个调用。其本意是,设计中要注意松耦合。 这个很好理解,如果类和类之间没什么联系就不说了。但是如果类之间有联系,比如类1要调用类2的方法或属性,不能说我在类1中引用类2,然后利用类2的引用调用类2的属性或方法。正确的处理是用委托或事件。这样减少类的耦合。下面拿原创 2012-03-12 16:58:43 · 2433 阅读 · 0 评论 -
面向对象设计原则详解:依赖倒置原则
定义:抽象不应该依赖于细节。细节应该依赖于抽象。程序中所有的依赖关系都应该终止于抽象类和接口。针对接口而非实现编程。任何变量都不应该持有一个指向具体类的指针或引用。任何类都不应该从具体类派生。任何方法都不应该覆写他的任何基类中的已经实现了的方法。 说通俗一点就是,你抽象了一个类,这个类在这个工程中可以用,如果再做一个工程,移植过来还能用。遵循这一目的是为了代码的复用。不过这一条规则我觉得原创 2012-03-11 15:32:10 · 2432 阅读 · 0 评论 -
面向对象设计原则详解:里氏替换原则
定义:子类型必须能替换掉他们的基本类型。只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。但是,反过来就不行了,有子类出现的地方,父类未必就能适应。 继承无非就是,完全按照父类的方法实现和除了父类的方法再加以扩展新的方法两种类型。那么子类要能替换父类,如何替换,不是说不能扩展新方法,相反,继承就是鼓励子类要扩展新的方法,原创 2012-03-10 11:31:06 · 2292 阅读 · 0 评论 -
面向对象设计原则详解:开放封闭原则
定义:软件实体(类、模块、函数等)应该是可以扩展的,但是不可修改。对于扩展是开放的,对于更改是封闭的。关键是抽象,将一个功能的通用部分和实现细节部分清晰的分离开来。 这里要求我们写代码要有抽象的概念。什么是抽象?指由实体抽离出概念的思考过程。就是从众多的对象中抽离出共同的本质的特征。在写代码的过程中,需要抽象类的地方,只需要抓住这个类的本质功能,不要老想着它在这个工程中的具体功能。原创 2012-03-08 14:27:04 · 6154 阅读 · 1 评论 -
面向对象设计原则详解:单一职责原则
定义:就一个类而言,应该仅有一个引起它变化的原因。 就是说一个类只做一件事,只关注它必须关注的,用哲学的语言来说,就是只抓主要矛盾。如果一个类承担了太多的职责,那就意味着这个类和其它程序集,或其它类总是互相影响,会造成整个程序逻辑混乱,既不利于程序的健壮性,也不利于后期维护。所以在设计之前,就要规划好各个类的,各个程序集的职责,显示界面的就只关心界面显示,不要再显示界面的类里去处理后台要做的原创 2012-03-07 16:01:41 · 2608 阅读 · 0 评论 -
读书笔记18:命令模式
1、定义:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。[GOF 《设计模式》]2、角色Command——用来执行操作的接口。CreateCommand——将一个接收者对象绑定一个动作,并实现执行命令操作。Invoker——要求该命令执行。Receiver——知道如何实施与执行一个与请求相关的操作,任何类都原创 2012-02-25 16:35:52 · 1666 阅读 · 0 评论 -
读书笔记17:桥接模式
概念 将抽象部分和与之对应的实现部分分离,使它们可以独立地变化。角色Implementor—— 定义实现类的接口CreateImplementorFirst(CreateImplementorSecond)——实现Implementor接口及定义其具体实现。Abstraction——定义抽象的接口。是依据Implementor所构成的高阶操作。RefinedAbstract原创 2012-01-11 20:43:52 · 3882 阅读 · 0 评论 -
读书笔记16:组合模式
概念 将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。角色 Component:组合中对象接口 Leaf:叶子,继承自Component Composite:分支,继承自Component 注意:这里分为透明模式和安全模式,透明模式指,叶子和分支完全继承自Component,即使没用的方原创 2012-01-09 22:29:44 · 2048 阅读 · 0 评论 -
读书笔记15:备忘录模式
1、 概念在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复至保存时的状态。2、 模型角色:Originator(发起者)——创建备忘录Memorandum,并且根据需要决定,需要保存那些状态。Memorandum(备忘录)——负责存储Originator对象的内部状态,并防止Originator以外的对象访问这个备忘录。原创 2011-12-08 19:57:10 · 1358 阅读 · 0 评论 -
读书笔记14:适配器模式
1、 概念将一个类的接口转换成另外一个 用户希望的接口,解决由于接口不兼容而不能一起工作类,能一起工作。2、 模型Target——客户端希望的接口。NeedAdapter——新增的类,没有实现Target接口。由于客户端只认Target的一系列方法,所以NeedAdapter没法在客户端使用。Adapter——适配器,实现Target接口,并负责当调用Target时,能调用原创 2011-12-07 18:32:30 · 1341 阅读 · 0 评论 -
读书笔记13:状态模式
1、概念 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。主要解决,当一个对象状态转换的条件表达式过于复杂时把状态的判断逻辑转移到表示不同状态的一系列类当中。将复杂的逻辑判断简化。2、模型 有三个角色, State——抽象状态类,封装一个与特定状态相关的行为。 CreateState——具体状态,实现一个特定状态的行为。原创 2011-12-06 22:10:51 · 1526 阅读 · 0 评论 -
读书笔记12:观察者模式
1、概念定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象,这个主题的状态发生变化是就通知所有的观察者对象,是这些观察者自动更新自己。2、角色观察者(Observer)—观察者有一个更新自己状态的方法,当它观察的那个主题的装太发生了变化,主题会通知这些观察者,观察者接到通知后更新自己的状态。所以观察者有一个Update()方法。主题(Subject)—主题包含多个观察原创 2011-11-24 17:21:49 · 1576 阅读 · 0 评论 -
读书笔记11:建造者模式
1、概念将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。2、角色产品(Product)——根据不同建造者建造的结果;抽象建造者(Builder)——包含详细的建造步骤;指挥者(Director)——安排如何建造,如何安排步骤的先后顺序;具体的建造者——根据不同的需求,实现Builder的步骤,每一步骤如何实现是不同的,但是Builder中的所有步骤原创 2011-11-23 20:30:50 · 1542 阅读 · 0 评论 -
读书笔记10:外观模式
1、 概念为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,该接口使子系统更加容易使用。2、 模型 public class ModularA { public void ModularAMethod() { Console.WriteLine("A模块的方法。"); }原创 2011-11-21 11:36:09 · 1668 阅读 · 3 评论 -
读书笔记9:面向对象设计原则
单一职责原则 就一个类而言,应该仅有一个引起它变化的原因。职责即为“变化的原因”。 开放封闭原则 软件实体(类、模块、函数等)应该是可以扩展的,但是不可修改。对于扩展是开放的,对于更改是封闭的。关键是抽象,将一个功能的通用部分和实现细节部分清晰的分离开来。理氏替换原则 子类型必须能替换掉他们的基本类型。依赖倒置原则 抽象不应该依赖于细节。细节应该依赖于抽象。程序中所有的原创 2011-11-20 20:35:49 · 1454 阅读 · 0 评论 -
读书笔记8:模板方法模式
1、 概念 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类不改变算法的结构也可以重定义某些算法的特定步骤。2、 模型 模板方法模式在编程中是经常用到的,就不做详细解释了。常见模型如下:using System;using System.Collections.Generic;using System.Text;namespac原创 2011-11-16 17:23:32 · 1455 阅读 · 0 评论 -
读书笔记7:原型模式
今天刚看了原型模式,刚一开始还真没弄明白这个模式想干嘛,因为一直都在使用clone方法,我觉得到处深度clone和到处new一个对象的实例,那不是一样的吗?后来查了资料也发帖子问了,其实clone和new有区别的,很简单,clone后的对象的实例不仅和原对象的实例结构一致而且值也一致;而new出来的对象的实例只是结构一致,值是默认值。其实原型模式它的根本目的是创建对象的实例,而且是要创建和已经存在原创 2011-11-15 16:57:22 · 1467 阅读 · 0 评论 -
读书笔记6:工厂方法模式
1、概念 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延伸到子类。2、背景 已经知道工厂模式,有一个父类SuperClass,以及这个父类的不同实现方法和算法的若干个子类ClassA,ClassB... ...,有一个工厂类DAOFactory,根据客户端传来的标识决定调用哪个子类。如下:using System;using Sys原创 2011-11-14 17:38:45 · 1737 阅读 · 1 评论 -
读书笔记5:代理模式
1、概念 给某一对象提供一个代理对象,并由代理对象控制原对象的引用。2、模型代理模式所涉及的角色有:抽象主题角色:声明了真实主题和代理主题的共同接口。代理主题角色:内部含有对真实主题的引用,可以操作真实主题对象; 代理主题角色提供和真实主题角色相同的接口,可以代替真实主题角色; 代理主题角色被调用传递给真实主题角色之前和之后都要执行某个操作,这样才发挥原创 2011-11-14 17:04:14 · 1492 阅读 · 0 评论 -
读书笔记4:单例模式
单例模式是指在应用程序的运行周期内,一个类始终只有一个实例,不论在何处访问都是如此。 一般单例模式有两种形式。 1、通过私有构造器实现 定义一个类构造器为private,有一个private的static变量,初始化的时候实例化;通过一个public的GetInstance方法获取对象的引用。public class Singleton{ priva原创 2011-11-12 14:18:12 · 2223 阅读 · 0 评论 -
读书笔记3:装饰模式
1、背景 给对象增加新功能,如何实现: (1)、在原类里面增加——违背开放封闭原则,类可以扩展但不能被修改。 (2)、利用继承扩展功能——造成类不断增多。 例子:给汽车增加对讲机系统,GPS定位系统,影视播放等,这些都不是汽车类的属性。如何增加? 2、认识装饰模式 装饰模式模型如下: 1、Component类 public abstract cla原创 2011-11-11 16:29:20 · 3728 阅读 · 0 评论 -
读书笔记2:策略模式
策略模式:定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响使用算法的客户。 我觉得,策略模式有点类似于工厂模式:继承一个父类,不同的子类实现父类的方法都不同,然后根据需求初始化相应的子类。不同的是策略模式是针对算法的,工厂模式可以使用所有这种情况。依然以截取网页功能为例:截取算法父类: 对于不同的网页截取算法不同,可以抽象一个父原创 2011-11-10 10:23:55 · 1899 阅读 · 0 评论 -
读书笔记1:简单工厂模式
工厂模式,这几乎是最常见的了,当年在学校的时候,老师讲了n多设计模式,只有这个至今还能想起来的。工作中我用过两个地方,一是数据库的连接,二是和书上的收银台的例子一样的那种。1、连接数据库,以access为例。这种最常见所以记得很清。 public class DAOFactory { static OleDbConnection conn;原创 2011-11-09 03:33:09 · 2248 阅读 · 0 评论