设计模式-C#
设计模式讲解。
李公子lm
宝剑锋从磨砺出,梅花香自苦寒来。
展开
-
23.解释器模式(Interpreter Pattern)
解释器模式解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。意图:给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。优点:可扩展性比较好,灵活。增加了新的解释表达式的方式。易于实现简单文法。缺点:可利用场景比较少。对于复杂的文法比较难维护。解释器模式会引起类膨胀。解释器模式采用递原创 2021-04-14 08:59:49 · 127 阅读 · 0 评论 -
22.访问者模式(Visitor Pattern)
访问者模式在现实生活中,有些集合对象存在多种不同的元素,且每种元素也存在多种不同的访问者和处理方式。例如,公园中存在多个景点,也存在多个游客,不同的游客对同一个景点的评价可能不同;医院医生开的处方单中包含多种药元素,査看它的划价员和药房工作人员对它的处理方式也不同,划价员根据处方单上面的药品名和数量进行划价,药房工作人员根据处方单的内容进行抓药。访问者模式将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多原创 2021-04-13 16:30:35 · 111 阅读 · 0 评论 -
21.模板方法模式(TemplateMethod Pattern)
模板方法模式模板方法顾名思义就是提供一套模板,在日常生活中,我们去银行办理业务,一般是经过取号,排队,办理业务,对银行工作人员进行评价四个阶段,其中,取号,排队,评价对每个人来说都是一样的,我就可以把这三个步骤抽离出来放到父类去实现,子类继承父类即可,这样对所有继承这个父类的子类来说都必须有这三个步骤。模板方法方式的思想就是把一些固定操作放到父类实现,而对于一些特殊操作则放到子类实现。意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的原创 2021-04-13 15:43:16 · 119 阅读 · 0 评论 -
20.策略模式(Strategy Pattern)
策略模式在平时生活中,我们出行可以选择开车,坐地铁,做公交,不管采用那种方式都可以到达目的地,再比如,要对一个数组进行从小到大的排序,可以选择快速排序,冒泡排序,插入排序等算法,得到的结果也是一样的,策略模式的关键是把多个算法组合起来并提供一个入口。意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。策略模式的主要优点如下。多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句,如 if…else 语句、switch…case 语句。策略模式提供了一系列的可供重用的算原创 2021-04-13 15:05:10 · 144 阅读 · 0 评论 -
19.状态模式(State Pattern)
状态模式在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。状态模式是一种对象行为型模式,其主要优点如下。结构清晰,状态模式将与特定状态相关的行为局部化到一个状态中,并且将不同状态的行为分割开来,满足“单一职责原则”。将状态转换显示化,减少对象间的相互依赖。将不同原创 2021-04-13 14:50:32 · 91 阅读 · 0 评论 -
18.观察者模式(Observer Pattern)
观察者模式观察者模式的核心思想是当一个对象的状态改变时,可以自动的通知其他对象,举个简单的例子,在上学的时候,同桌在偷偷睡觉,然后另一个人望风,若老师过来了,则叫醒睡觉的同学,望风的同学就是观察者。意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。观察者模式是一种对象行为型模式,其主要优点如下。降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。符合依赖倒置原则。目标与观察者之间建立了一套触发机制。它的主要缺点如下。目原创 2021-04-13 14:25:49 · 218 阅读 · 0 评论 -
17.备忘录模式(Memento Pattern)
备忘录模式备忘录模式能记录一个对象的内部状态,当用户后悔时能撤销当前操作,使数据恢复到它原先的状态。比如操作word的时候的撤销功能,浏览器的回退功能,等等都可以采用备忘录来实现。意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。备忘录模式是一种对象行为型模式,其主要优点如下。提供了一种可以恢复状态的机制。当用户需要时能够比较方便地将数据恢复到某个历史的状态。实现了内部状态的封装。除了创建它的发起人之外,其他对象都不能够访问这些状态信息。简化了发起人类。发起原创 2021-04-13 13:47:10 · 130 阅读 · 0 评论 -
16.中介者模式(Mediator Pattern)
中介者模式中介者模式的核心思想是降低对象间的耦合程度,比如在MVC的架构模式中,C(Controller)就是介于M(Model)和V(View)之间的中介者。意图:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式是一种对象行为型模式,其主要优点如下。类之间各司其职,符合迪米特法则。降低了对象之间的耦合性,使得对象易于独立地被复用。将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维原创 2021-04-13 11:18:52 · 137 阅读 · 0 评论 -
15.迭代器模式(Iterator Pattern)
迭代器模式迭代器在日常生活中也有应用,比如我们去超市买完东西然后排队结账,收银员只需要扫描商品上的条形码就知道商品价格,而不用关系到底是什么商品,在程序中的,各种List,Collection等也都采用了迭代器的思想。意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。其主要优点如下。访问一个聚合对象的内容而无须暴露它的内部表示。遍历任务交由迭代器完成,这简化了聚合类。它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。增加新的聚合类和迭原创 2021-04-13 10:57:30 · 111 阅读 · 0 评论 -
14.命令模式(Command Pattern)
命令模式比如我们在linux系统下打开终端输入ls,ls就是一个命令,输入命令之后再有具体的对象去执行。命令模式将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。命令模式的主要优点如下。通过引入中间件(抽象接口)降低系统的耦合度。扩展性良好,增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类,且满足“开闭原创 2021-04-13 10:30:26 · 120 阅读 · 0 评论 -
13.责任链模式(Chain of Responsibility Pattern)
责任链模式在工作中会有走流程的时候,一个采购流程需要项目经理签字,财务签字,老板签字等,而责任链模式就是把请求依次传递给接受者,接受者可能有多个,直到有一个接受者处理这个请求为止。意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。责任链模式是一种对象行为型模式,其主要优点如下。降低了对象之间的耦合度。该模式使得一个对象无须知道到底是哪一个对象处理其请求以及链的结构,发送者和接收者也无须拥有对方的明确信息。原创 2021-04-13 09:44:51 · 87 阅读 · 0 评论 -
12.代理模式(Proxy Pattern)
代理模式在生活中,我们租房或者买房的时候可以找中介,由中介替我们完成一些工作,再比如我们无法访问一些网站时,通过代理就可以访问。在系统中,我们有时不想暴露系统内部的逻辑,就可以采用代理的方式,代理对象作为访问对象和目标对象之间的中介。代理模式的主要优点有:代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;代理对象可以扩展目标对象的功能;代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性其主要缺点是:代理模式会造成系统设计中类的数量增加在原创 2021-04-12 16:58:25 · 107 阅读 · 0 评论 -
11.享元模式(Flyweight Pattern)
享元模式在平时生活中,我们可以看到很多重复的东西,比如下围棋时的棋子,一个网吧的电脑等等,在程序设计的时候,若需要创建大量的对象,用传统的方法势必要占用较大的内存空间,造成资源浪费,享元模式通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。意图:运用共享技术有效地支持大量细粒度的对象。享元模式的主要优点是:相同对象只要保存一份,这降低了系统中对象的数量,从而降低了系统中细粒度对象给内存带来的压力。其主要缺点是:为了使对象可以共享,需要原创 2021-04-12 16:01:18 · 124 阅读 · 0 评论 -
10.外观模式(Facade Pattern)
外观模式在日常生活中,比如老板布置个任务要办一个展会,就会找到经理说要办一个展会然后由经理全权安排,然后经理找到小王选择场地,找到小李邀请媒体,找到小赵保证后勤等等,这里经理就充当了一个门面的角色,在系统设计时也是一样,对于客户端来说,比如访问的A接口在服务A,B接口在服务B,地址不一样的话,管理起来很麻烦,所以需要一个统一的入口。网关Ocelot就是符合外观模式。我们写的一个个Controller也都是符合外观模式。意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使原创 2021-04-12 09:54:08 · 210 阅读 · 0 评论 -
9.组合模式(Composite Pattern)
组合模式在日常生活中可以发现很多整体-部分的关系,比如部门和员工,文件和文件夹等。组合模式是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,使用户对单个对象和组合对象具有一致的访问性,属于结构型设计模式。意图:将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。组合模式的主要优点有:组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;更容易在组合体内原创 2021-04-09 17:07:56 · 86 阅读 · 0 评论 -
8.装饰器模式(Decorator Pattern)
装饰器模式在日常生活中有这样一个场景,加入我需要做一个蛋糕,蛋糕整体做好后,我需要在蛋糕上加上蜡烛,加上草莓,加上牌子(生日快乐)等等,再比如我们去饭馆吃饭,可以在鸡腿,鸭腿,卤蛋等等。这种在不改变原来结构的情况下,对其进行功能扩展的方式,就是装饰器的应用场景。意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。装饰器模式的主要优点有:装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用通过使用不用装饰类及这原创 2021-04-09 15:49:41 · 104 阅读 · 0 评论 -
7.桥接模式(Bridge Pattern)
桥接模式我们在用画笔画画的时候可以发现,画笔的种类有很多种,粗笔刷,细笔刷,以及硬笔刷,软笔刷等等,颜色也有很多种,红的,蓝色,绿的,紫的等等,那他们的组合就是 m*n,像这样多个维度都可以变化的例子还有很多,不同大小,颜色,字体的文字等等。若把每一种情况都单独写出来的话,工作量异常庞大,所以对于这种情况,用桥接模式就可以很好的实现。意图:将抽象部分与实现部分分离,使它们都可以独立的变化。在类图中我们可以看到,把Color和PaintBrush都改成抽象类,其他的相关的子类,继承自抽象类,而如果原创 2021-04-09 11:16:05 · 123 阅读 · 0 评论 -
6.适配器模式(Adapter Pattern)
适配器模式在日常生活中使用笔记本充电的时候,由于电源插座用的是交流电,而笔记本需要直流电,这就需要一个电源适配器。或者现在很多手机都取消了耳机接口,若想用有线耳机听音乐的话,需要在手机的type-c接口上接一个type-c转3.5mm耳机的转接口,这也是一个适配器。意图:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。该模式的主要优点如下。 * 客户端通过适配器可以透明地调用目标接口。*复用了现存的类,程序员不需要修改原有代码而原创 2021-04-09 10:34:56 · 120 阅读 · 0 评论 -
5.原型模式(Prototype Pattern)
原型模式在某些场景下,我们需要复制对象的时候可以采用这种方式,例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。主要解决:在运行期建立和删除原型。代码如下。using System;namespace _05_Prototype{ class Program { /// <summa原创 2021-04-08 15:56:18 · 146 阅读 · 0 评论 -
4.建造者模式(Builder Pattern)
建造者模式在日常生活中有这样一个场景,我想要一台电脑,但是我又不想要自己买配件组装,于是找到一个店铺把找到满意的电脑下单,商家在收到我的订单之后,开始安排技术人员组装,组装好之后再把电脑寄过来。对于一台电脑来说,里面包含CPU、主板、显卡、内存、硬盘、电源、机箱等等配置,可以把电脑当成一个复杂的对象,CPU,主板等电脑配件,又有很多种选择,但是组装电脑的过程基本是一样的,这时候就可以用建造者模式实现这一过程。意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。主要解决:主要原创 2021-04-08 15:13:00 · 130 阅读 · 0 评论 -
3.抽象工厂(AbstractFactory)
抽象工厂抽象工厂是在工厂方法的基础之上,在抽象出来一个工厂的工厂。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。主要解决:主要解决接口选择的问题。在上图所示的类图中,可以看到,ChineseFactory和AmericanFactory都继承自接口IAbstractFactory,而在每个工厂方法下,又有两个方法,IPhoneColor,IPhoneS原创 2021-04-08 14:10:49 · 136 阅读 · 0 评论 -
2.工厂方法(Factory Method)
1.工厂方法(Factory Method)为什么要有工厂方法?我们知道。每一种设计模式的出现,都是为了解决一些问题的,那么工厂方法想要解决什么问题呢?先看个示例。Monster m = new Monster();很简单哈,就是实例化了一个类,那么思考一个问题,如果对象的创建过程过于繁琐或庞大,或该类有可能进行同类型扩展, 那么在这样的简单的去实现就不太好了,这时候我们建议将类的...原创 2018-11-19 16:29:00 · 206 阅读 · 0 评论 -
1.单例模式(Singleton Pattern)
1.单例模式(Singleton Pattern)意图:一个类仅有一个实例,并提供一个访问他的全局访问点。那么哪里会用到单例模式呢?比如任务管理器,回收站,打印机,只能打开一个窗口,在比如,英雄联盟里的人物等等。单例模式特点:该类不能被外界任意实例化,该类向外界提供一个可获得该类的实例的方法,该类只能被实例化一次。接下来看个例子using System;using System....原创 2018-08-07 17:21:00 · 99 阅读 · 0 评论