大话设计模式总结样本

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

UML类图
备注:1.+public、-private、#protect、棒棒糖表达接口
2.△——继承关系(空心三角+实线)
△- - - - 实现接口(空心三角+虚线)
——> 关联(实线箭头)
- - - - -> 依赖(虚线箭头)
◇——> 聚合关系(空心菱形+实线箭头)
◆——> 组合关系(实心菱形+实线箭头)
1、简朴工厂
2、方略者模式
3、单一原则
4、开放封闭原则:软件实体(类、模块、函数等)应当可以扩展,但是不能修改
5.1、依赖倒转原则:a抽象不应当依赖细节,细节应当依赖抽象(针对接口变成,不要对实现编程);b高层模块不应当依赖低层模块。

两个都应当依赖抽象
5.2、里氏替代原则
依赖倒转其实可以说是面向对象设计标志,用哪种语言来编写程程不重要,如果编写时候考虑都是如何针对抽象编程而不是对细节编程,即程序中所有依赖关系都是终结于抽象类或者接口,那就是面向对象设计,反之那就是过程化设计了
6、装饰模式:动态给一种对象添加额外职责,就增长功能来说,装饰模式比生成子类更加灵活。

装饰模式是为已有功能动态地添加更多功能一种方式。

7、代理模式:为其她对象提供一种代理以控制对这个对象访问
8、工厂办法:定义一种用于创立对象接口,让子类觉得实例化哪一种类。

工厂办法使一种类实例化延迟到其子类
简朴工厂模式最大长处在于工厂类中包括了必要逻辑判断,依照客户端选取条件动态实例化有关类,对于客户端来说,去除了与详细产品依赖
9、原型模式:原型实例指定创立对象种类,并且通过拷贝这些原型创立新对象。

普通在初始化信息不发生变化状况下,克隆是最佳办法,这既隐藏了对象创立细节,又对性能是大大提高(等于不用重新初始化对象,而是动态地获得对象运营时状态)
9.2、浅复制与深复制
MemberwiseClone()办法是这样,如果自定是指类型,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用对象,因而原始对象及其副本引用同一对象。

浅复制:被复制对象所有变量都具有与本来对象相似值,而所有对其她对象引用都依然指向本来对象;深复制:把引用对象变量指向复制过新对象,而不是原有被引用对象
10、模板办法模式:当咱们要完毕在某一种细节次一致一种过程或一系列环节,但其个别环
节在更详细层次上实现也许不同步,咱们普通考虑用模板办法模式来解决。

模板办法模式就是通过把不变行为搬移到超类,去除子类中重复代码来体现她优势。


是提供了一种较好代码复用平台。

当不变和可变行为在办法子类实现中混合在一起时候,不变行为就会在子类中重复浮现。

咱们通过模板办法模式把这些行为搬移到单一地方,这样就协助子类挣脱重复不变行为纠缠。

11、迪米特法则(至少知识原则):如果两个类不必彼此直接通信,那么这两个类就不应当发生直接互相作用。

如果其中一种类需要调用另一种类某一种办法话,可以通过第三者转发这个调用。

迪米特法则一方面强调前提是在类构造设计上,每一种类都应当尽量减少成员访问权限。

主线思想是强调了类之间松耦合。

类之间耦合越弱,越有助于复用,一种处在弱耦合类被修改,不会对关于系类导致波及12、外观模式:为子系统中一组接口提供一种一致界面,此模式定义了一种高层接口,这个接口使得这一子系统更加容易使用
一方面,在设计初期阶段,应当要故意识将不同两个层分离,层与层之间建立外观facade;另一方面,在开发阶段,子系统往往由于不断重构演化而变得越来越复杂,增长外
观facade可以提供一种简朴接口,减少她们之间依赖;第三,在维护一种遗留大型系统时,也许这个系统已经非常难以维护和扩展。

为新系统开发一种外观facade类,来提供设计粗糙或高度复杂遗留代码比较清晰简朴接口,让新系统与facade对象交互,facade与遗留代码交互所有复杂工作。

13、建造者模式:将一种复杂对象构建与它表达分离,使用同样构建过程可以创立不同表达。

重要是用于创立某些复杂对象,这些对象内部构建间建造顺序普通是稳定,但对象外部构建普通面临着复杂变化。

建造者模式好处就是使得建造代码与表达代码分离,由于建造者隐藏了该产品是如何组装,所有若需要变化一种产品内部表达,只需要再定义一种详细建造者就可以了。

建造者模式是在创立复杂对象算法应当独立于该对象构成某些以及它们装配方式时合用模式。

14、观测者模式:定义了一种一对多依赖关系,让各种观测者对象同步监听某一种主题对象。

这个主题对象在状态发生变化时,会告知所有观测者对象,使她们可以自动更新自己。

特点:将一种系统分割成一系列互相协作类有一种很不好副作用,那就是需要维护有关对象间一致性。

咱们不但愿为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便
使用地方:当一种对象变化需要同步变化其她对象,并且不懂得详细有多少对象有待变化时,应当考虑使用观测者模式。

当一种抽象模型有两个方面,其中一方面依赖于另一方面,这时用观测者模式可以讲这两者封装在独立对象中使她们各种独立地变化和复用。

观测者模式所做工作就是解除耦合,让耦合双方都依赖于抽象,而不是依赖于详细。

从而使得各自变化都不会影响另一边变化。

委托就是一种引用办法类型。

一旦为委托分派了办法,委托将与该办法具备完全相似行为。

委托办法使用可以向其她任何办法同样,具备参数和返回值。

委托可以看作是对函数抽象,是函数‘类’,委托实例将代表一种详细函数
15、抽象工厂模式:提供一种创立一系列有关或互相依赖对象接口,而无需指定它们详细类
好处:1、易于互换产品系列,由于详细工厂类,在一种应用中只需要再初始化时候浮现一次,这就使得变化一种应用品体工厂变得非常容易,她只需要变化详细工厂即可使用不同产品配备。

2、让详细创立实例过程与客户端分离,客户端是通过她们抽象接口操作实例,产品详细类名也被详细工厂实现分离,不会出当前客户代码中。

缺陷:新增时修改比较复杂。

编程方式:依赖注入(反射)。

命名空间→using System.Reflection
可以代替简朴工厂
16、状态模式:当一种对象内在状态变化时容许变化其行为,这个对象看起来像是变化了其类。

重要解决是当控制一种对象状态转换条件表达式过于复杂时状况。

把状态判断逻辑转移到表达不同状态一系列类当中,可以把复杂判断逻辑简化。

好处:将特定状态有关行为都放入一种对象中,由于所有与状态有关代码都存在于某个ConcreteState中,所有通过定义新子类可以很容易地增长新状态和转换。

目就是为了消除庞大条件分支语句。

状态模式通过把各种状态转移逻辑分不到state子类之间,来减少互相间依赖。

使用情景:当一种对象行为取决于她状态,并且她必要在运营时刻依照状态变化她行为时,就可以考虑使用状态模式
17、适配器模式:将一种类接口转换成客户但愿此外一种接口。

Adapter模式使得原本由于接口不兼容而不能一起工作哪些类可以一起工作。

(类适配器模式和对象适配器模式)
在软件开发中,也就是系统数据和行为都对的,但接口不符时,咱们应当考虑适配器,目是使控制范畴之外一种原有对象与某个接口匹配。

适配器模式重要应用于但愿复用某些现存类,但是接口又与复用环境规定不一致状况。

使用场景:使用一种已经存在类,但如果它接口,也就是它办法和你需求不相似时,就应当考虑用适配器模式。

两个类所做事情相似或相似,但是具备不同接口时需要使用它,客户端代码统一调用同一接口就行了,这样可以更简朴,更直接,更紧凑
DataAdapter用作dataset和数据源之间适配器以便检索和保存数据。

Dataadapter通过映射Fill(这更改了DataSet中数据以便与数据源中数据相匹配)和Update(这更改了数据源中数据以便与DataSet中数据相匹配)来提供这一适配器。

18、备忘录(memento):在不破坏封装性前提下,捕获一种对象内部状态,并在该对象之外保存这个状态。

这样后来就可以将该对象恢复到原先保存状态。

Memento模式比较合用于功能比较复杂,但需要维护或记录属性历史类,或者需要保存属性只是众多属性中一小某些时,可以依照保存Memento信息还原到前一状态。

如果在某个系统中使用命令模式时,需要实现命令撤销功能,那么命令模式可以使用备忘录模式来存储可撤销操作状态。

19、组合模式:将对象组合成树形构造以表达‘某些--整体’层次构造。

组合模式使得顾客对单个对象和组合对象使用品有一致性。

透明方式与安全方式:
透明方式就是说在Component中声明所有用来管理子对象办法,其中涉及Add、Remove等。

这样实现Component接口所有子类都具备了Add和Remove。

这样做多久好处就是叶节点和枝节点对于外界没有区别,她们具备完全一致行为接口。

但问题很明显,由于Leaf类本领不具备Add()、Remove()办法功能,因此实现它是没故意义。

安全方式就是在Component接口中不去声明Add和Remove办法,那么子类Leaf也就不需要去实现它,而是在Composite声明所有用来管理子类对象办法,但是由于不够透明,因此树
叶和树枝类将不具备相似接口,客户端调用需要做相应判断,带来了不便。

组合模式使用场景:需求中是体现某些与整体层次构造时,但愿顾客可以忽视组合对象与单个对象不同,统一地使用组合构造中所有对象时,就应当考虑用组合模式了。

好处:基本对象可以被组合成更复杂组合对象,而这个组合对象又可以被组合,这样不断地递归下去,客户代码中看,任何用到基本对象地方都可以使用组合对象了。

顾客是不用关怀究竟是解决一种叶节点还是解决一种组合组件,也就不用着为定义组合而写某些选取判断语句了。

组合模式让客户可以一致地使用组合构造和单个对象。

20、迭代器模式:提供一种办法顺序访问一种聚合对象中各个元素,而又不暴露该对象内部表达。

当你需要访问一种汇集对象,并且不论这些对象时什么都需要遍历时候,你就应当考虑迭代器模式。

(foreach in)
好处:当你需要对汇集有各种方式遍历时,可以考虑用迭代器模式
.NET迭代器实现:IEumerator支持对非泛型集合接口迭代接口
迭代器(Iterator)模式就是分离了集合对象遍历行为,抽象出一种迭代器类来负责,这样
既可以做到不暴露集合内部构造,又可让外部代码透明地访问集合内部数据。

21、单例模式:保证一种类仅有一种实例,并提供一种访问它全局访问点。

普通咱们可以让一种全局变量使得一种对象被访问,但她不能防止你实例化各种对象。

一种最佳办法就是,让类自身负责保存它唯一实例。

这个类可以保存没有其她实例可以被创立,并且它可以提供一种访问该实例办法。

单例模式由于Singleton类封装它唯一实例,这样它可以严格地控制客户如何访问它以及何时访问它。

简朴地说就是对唯一实例受控访问。

Lock是保证当一种线程位于代码临界区时,另一种线程不进入临界区。

如果其她线程视图进入锁定代码,则它将始终等待(即被制止),直到该对象被释放。

(单锁和双重锁定)
C#与公共语言运营库也提供了一种‘静态初始化’办法,这种办法不需要开发人员显式地编写线程安全代码,即可解决多线程环境下它是不安全问题(sealed和readonly)。

这种静态初始化方式是在自己被加载时就将自己实例化,因此被形象地称之为饿汉式单例类;要在第一次被引用时,才会将自己实例化,因此就被成为懒汉式单例类。

22.1、桥接模式:将抽象某些与它实现某些分离,使她们都可以独立地变化。

什么叫抽象与它实现分离,这并不是说,让抽象类与其派生类分离,由于这是没有任何意义。

实现指是抽象类和它派生类用来实现自己对象
实现系统也许有多角度分类,每一种分类均有也许变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间耦合。

只要真正进一步地理解了设计原则,诸多设计模式其实就是原则应用而已,或许在不知不觉中就在使用设计模式了。

对象继承关系是在编译时就定义好了,因此无法运营时变化从父类继承实现。

子类实现与它父类有非常紧密依赖关系,以至于父类实现中任何变化必然会导致子类发生变化。

当你需要复用子类时,如果继承下来实现不适合解决新问题,则父类必要重写或被其她更适当类替代。

这种依赖关系限制了灵活性并最后限制了复用性
22.2合成/聚合复用原则:尽量使用合成/聚合,尽量不要使用类继承。

聚合表达一种弱‘拥有’关系,体现是A对象可以包括B对象,但B对象不是A对象一某些;合成则是一种强‘拥有’关系,体现了严格某些和整体关系,某些和整体生命周期同样。

好处:优先使用对象合成/聚合将有助于保持每个类被封装,并被集中在单个任务上。

这样类和类继承层次会保持较小规模,并且不太也许增长为不可控制庞然大物
23、命令模式:将一种祈求封装为一种对象,从而使你可用不同祈求对客户进行参数化;祈求排队或记录祈求日记,以及支持可撤销操作。

长处:第一,它能较容易地设计一种命令队列;第二,在需要状况下,可以叫容易地将命令记入日记;第三,容许接受祈求一方决定与否要否决祈求;第四,可以容易地实现对祈求撤销和重做;第五,由于加进新详细命令类不影响其她类,因而增长新详细命令类很容易。

最核心长处是命令模式把祈求一种操作对象与懂得怎么执行一种操作对象分割开
敏捷开发原则告诉咱们,不要为代码添加基于猜测,实际不需要功能。

如果不清晰一种系统与否需要命令模式,普通就不要着急去实现她,事实上,在需要时候通过重构实现这个模式并不困难,只有在真正需要如撤销/恢复操作等功能时,把本来代码重构为命令模式才故意义
24、职责链模式:使各种对象均有机会解决祈求,从而避免祈求发送者和接受者之间耦合关系。

将这个对象连成一条链,并沿着这条链传递该祈求,直到有一种对象解决它为止。

好处:当客户提交一种祈求时,祈求时沿链传递直至有一种对象负责解决它。

使得接受者和发送者都没有对方明确信息,且链中对象自己也并不懂得链构造。

成果是职责链可简化对象互相连接,它们仅需保持一种指向其后继者引用,而不需要保持它所有候选接受者引用。

由于是在客户端来定义链构造,可以随时地增长或修改解决一种祈求构造。

增强了给对象指派职责灵活性,但是也要当心,一种祈求极有也许到来链末端都得不到解决,或者由于没有对的配备而得不到解决,需要事先考虑全面。

25、中介者模式(Mediator):用一种中介对象来封装一系列对象交互。

中介者使各对象不需要显示地互相引用,从而使其耦合松散,并且可以独立地变化它们之间互相
中介者模式很容易在系统中应用,也很容易在系统中误用。

当系统浮现了‘多对多’交互复杂对象群时,不要急于使用中介者模式,而要先反思你系统在设计上与否合理优缺陷:一方面Mediator浮现减少了各个Colleague耦合,使得可以独立地变化和复用各个Colleague类和Mediator;另一方面,由于把对象如何协作进行了抽象,将中介作为一种独立概念并将其封装在一种对象中,这样关注对象就从对象各自自身行为转移到它们之间交互上来,也就是站在一种更宏观角度去看待系统。

缺陷:由于concreteMediator控制集中化,于是就把交互复杂性变成了中介者复杂性,这就使得中介者会变得比任何一种ConcreteColleague都复杂。

中介者模式普通应用于一组对象以定义良好但是复杂方式进行通信场合,以及想定制一种分布在各种类中行为,而又不想生成太多子类场合。

相关文档
最新文档