C#设计模式【完结】
文章平均质量分 96
本专栏主要介绍了23种设计模式的原理、应用场景及优缺点,每种设计模式都结合一个C#实例来加深理解,C#实例均在Visual Studio2019测试通过。
ElecNoon
梦想若缺少爱和信仰,终将成为生命的圈套!
展开
-
【C#设计模式】总目录(共23种)【已全部完结!】
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块..原创 2022-07-04 10:48:29 · 18973 阅读 · 11 评论 -
【C#设计模式】23.解释器模式(Interpreter Pattern)【行为型】
1.1 动机(Motivate)在软件构建过程中,如果某一特定领域的问题比较复杂,类似的模式不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。在这种情况下,将特定领域的问题表达为某种语法规则下的句子,然后构建一个解释器来解释这样的句子,从而达到解决问题的目的。1.2 意图(Intent)给定一个语言,定义它的文法的一种表示,并定义一种解释器,这个解释器使用该表示来解释语言中的句子。 ——《设计模式》GoF.........转载 2022-07-18 13:08:56 · 1140 阅读 · 2 评论 -
【C#设计模式】22.备忘录模式(Memento Pattern)【行为型】
在软件构建过程中,某些对象的状态在转换的过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节实现。如何实现对象状态的良好保存与恢复,但同时又不会因此而破坏对象本身的封装性?.........转载 2022-07-18 11:02:25 · 910 阅读 · 0 评论 -
【C#设计模式】21.访问者模式(Visitor Pattern)【行为型】
在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接在基类中做这样的更改,将会给子类带来很繁重的变更负担,甚至破坏原有设计。如何在不更改类层次结构的前提下,在运行时根据需要透明地为类层次结构上的各个类动态添加新的操作,从而避免上述问题?.........转载 2022-07-18 09:32:49 · 1072 阅读 · 0 评论 -
【C#设计模式】20.职责链模式(Chain of Responsibility Pattern)【行为型】
1.1 动机(Motivate)在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显式指定,将不可避免地带来请求发送者与接受者的紧耦合。如何使请求的发送者不需要指定具体的接受者,让请求的接受者自己在运行时决定来处理请求,从而使两者解耦。1.2 意图(Intent)避免请求发送者与接收者耦合在一起,让多个对象都有可能接受请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。 ——《设计模式》GoF......转载 2022-07-15 20:30:00 · 993 阅读 · 0 评论 -
【C#设计模式】19.策略模式(Strategy Pattern)【行为型】
1.1 动机(Motivate)在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?1.2 意图(Intent)定义一系列算法,把它们一个个封装起来,并且使它们可互相替换。该模式使得算法可独立于使用它的客户而变化。 ——《设计模式》GoF.........转载 2022-07-15 20:00:00 · 2580 阅读 · 3 评论 -
【C#设计模式】18.状态模式(State Pattern)【行为型】
1.1 动机(Motivate)在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同。如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转化之间引入紧耦合?1.2 意图(Intent)允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。 ——《设计模式》GoF......转载 2022-07-14 20:00:00 · 1334 阅读 · 0 评论 -
【C#设计模式】17.中介者模式(Mediator Pattern)【行为型】
1.1 动机(Motivate)在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断地变化。在这种情况下,我们可使用一个“中介对象”来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。1.2 意图(Intent)定义了一个中介对象来封装一系列对象之间的交互关系。中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为。 .....转载 2022-07-14 20:00:00 · 1391 阅读 · 0 评论 -
【C#设计模式】16.观察者模式(Observer Pattern)【行为型】
1.1 动机(Motivate)在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。1.2 意图(Intent)定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。 ——《设计模式》GoF转载 2022-07-14 20:00:00 · 2400 阅读 · 3 评论 -
【C#设计模式】15.迭代器模式(Iterator Pattern)【行为型】
1.1 动机(Motivate)在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“同一种算法在多种集合对象上进行操作”提供了可能。使用面向对象技术将这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种优雅的方式。1.2 意图(Intent)提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。 ——《设计模式》GoF....转载 2022-07-13 20:00:00 · 1004 阅读 · 0 评论 -
【C#设计模式】14.命令模式(Command Pattern)【行为型】
1.1 动机(Motivate)在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合——比如需要对行为进行“记录、撤销/重做(undo/redo)、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。1.2 意图(Intent)将一个请求封装为一个对象,从而使你可用不同的请求对客户(客户程序,也是行为的请求者)进行参数化;对请求排队或记录请求日志,以及支持可撤销的操..转载 2022-07-13 20:00:00 · 1700 阅读 · 1 评论 -
【C#设计模式】13.模板方法模式(Template Method Pattern)【行为型】
1.1 动机(Motivate)在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求?1.2 意图(Intent)定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 ——《设计模式》GoF......转载 2022-07-13 20:00:00 · 1809 阅读 · 0 评论 -
【C#设计模式】12.代理模式(Proxy Pattern)【结构型】
1.1 动机(Motivate)在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给使用者、或者系统结构带来很多麻烦。如何在不失去透明操作对象的同时来管理/控制这些对象特有的复杂性?增加一层间接层是软件开发中常见的解决方式。1.2 意图(Intent)为其他对象提供一种代理以控制对这个对象的访问。 ——《设计模式》GoF......转载 2022-07-12 20:00:00 · 1954 阅读 · 7 评论 -
【C#设计模式】11.享元模式(Flyweight Pattern)【结构型】
1.1 动机(Motivate)在软件系统中,采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价——主要指内存需求方面的代价。如何在避免大量细粒度对象问题的同时,让外部客户程序仍然能够透明地使用面向对象的方式来进行操作?1.2 意图(Intent)运用共享技术有效地支持大量细粒度的对象。 ——《设计模式》GoF............转载 2022-07-12 20:00:00 · 1374 阅读 · 1 评论 -
【C#设计模式】10.外观模式(Facade Pattern)【结构型】
1.1 动机(Motivate)在软件系统开发的过程中,当组件的客户(即外部接口,或客户程序)和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系统的变化之间的依赖相互解耦?1.2 意图(Intent)为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 ——《设计模式》GoF.........转载 2022-07-11 16:51:49 · 1321 阅读 · 0 评论 -
【C#设计模式】9.组合模式(Composite Pattern)【结构型】
1.1 动机(Motivate)客户代码过多地依赖于对象容器(对象容器是对象的容器,细细品味)复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁变化,带来了代码的维护性、扩展性等方面的弊端。如何将“客户代码与复杂的对象容器结构”解耦?如何让对象容器自己来实现自身的复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂的对象容器?1.2 意图(Intent)将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一..转载 2022-07-11 16:11:42 · 1993 阅读 · 2 评论 -
【C#设计模式】8.装饰模式(Decorator Pattern)【结构型】
1.1 动机(Motivate)在房子装修的过程中,各种功能可以相互组合,来增加房子的功用。类似的,如果我们在软件系统中,要给某个类型或者对象增加功能,如果使用“继承”的方案来写代码,就会出现子类暴涨的情况。比如:IMarbleStyle是大理石风格的一个功能,IKeepWarm是保温的一个接口定义,IHouseSecurity是房子安全的一个接口,就三个接口来说,House是我们房子,我们的房子要什么功能就实现什么接口,如果房子要的是复合功能,接口不同的组合就有不同的结果,这样就导致我们子类膨胀严重,.原创 2022-07-11 10:04:57 · 1987 阅读 · 0 评论 -
【C#设计模式】7.桥接模式(Bridge Pattern)【结构型】
1.1 动机(Motivate)在很多游戏场景中,会有这样的情况:【装备】本身会有的自己固有的逻辑,比如枪支,会有型号的问题,同时现在很多的游戏又在不同的介质平台上运行和使用,这样就使得游戏的【装备】具有了两个变化的维度——一个变化的维度为“平台的变化”,另一个变化的维度为“型号的变化”。如果我们要写代码实现这款游戏,难道我们针对每种平台都实现一套独立的【装备】吗?复用在哪里?如何应对这种“多维度的变化”?如何利用面向对象技术来使得【装备】可以轻松地沿着“平台”和“型号”两个方向变化,而不引入额外的复杂转载 2022-07-06 15:37:23 · 2178 阅读 · 2 评论 -
【C#设计模式】6.适配器模式(Adapter Pattern)【结构型】
1.1 动机(Motivate)在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?1.2 意图(Intent)将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 --《设计模式》Gof.........转载 2022-07-06 11:39:06 · 2342 阅读 · 3 评论 -
【C#设计模式】5.原型模式(Prototype)【创建型】
1.1 动机(Motivate)在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。如何应对这种变化?如何向“客户程序(使用这些对象的程序)”隔离出“这些易变对象”,从而使得“依赖这些易变对象的客户程序”不随着需求改变而改变?1.2 意图(Intent)使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。 --《设计模式》Gof..................转载 2022-07-05 20:45:00 · 2270 阅读 · 1 评论 -
【C#设计模式】4.工厂方法模式(Factory Method Pattern)【创建型】
随着需求的变化我们要不停地修改工厂里面的方法的代码,需求变化越多,里面的If–Else–也越多,这样就会造成简单工厂的实现逻辑过于复杂。设计模式是遵循一定原则而得来的,比如,我们要怎么增加代码,怎么修改代码,不是想怎么来就怎么来的,其中一个原则就是OCP原则,中文是【开放关闭原则】,对增加代码开发,对修改代码关闭,所以我们就不能总是这样修改简单工厂里面的方法。......转载 2022-07-18 14:23:24 · 3105 阅读 · 0 评论 -
【C#设计模式】4-0. 简单工厂模式【创建型】
简单工厂模式简单来说就是创建一个工厂类,通过输入的参数创建对象赋值给基类,完成对想要的派生类的调用,从而达成目标,具体的操作均在子类中完成,工厂类只负责运算逻辑和给基类赋值。.......................................原创 2022-07-01 16:24:01 · 4018 阅读 · 1 评论 -
【C#设计模式】3.建造者模式(Builder Pattern)【创建型】
1.1 动机(Motivate)在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?1.2 意图(Intent)将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。...............转载 2022-07-04 13:28:47 · 3162 阅读 · 0 评论 -
【C#设计模式】2.抽象工厂模式(Abstract Factory)【创建型】
1.1 动机(Motivate):在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种"封装机制"来避免客户程序和这种"多系列具体对象创建工作"的紧耦合?1.2 意图(Intent):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。.....................转载 2022-07-04 14:43:21 · 5390 阅读 · 0 评论 -
【C#设计模式】1.单件模式(Singleton Pattern)【创建型】
在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。如何绕过常规的构造器,提供一种机制来保证一个类只创建一个实例?这应该是类设计者的责任,而不是类使用者的责任。...........................原创 2022-07-04 10:34:57 · 5519 阅读 · 0 评论