
大话设计模式讲解.docx
7页Unified Modeling Language (UML)又称统一建模语言或标准建模语言,是始于1997年一个 OMG 标准,它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提 供模型化和可视化支持,包括由需求分析到规格,到构造和配置 面向对象的分析与设计 (00A&D, OOAD)方法的发展在80年代末至90年代中出现了一个高潮,UML是这个高潮的 产物它不仅统一了 Booch、Rumbaugh和Jacobson的表示方法,而且对其作了进一步的发 展,并最终统一为大众所接受的标准建模语言本书主人公 小菜(蔡遥)和大鸟(李大辽)本书的模式第一章 简单工厂模式1.1 小菜(蔡遥)面试受挫比如代码是否规范class Program{static void Main(string[] args){try{Console.Wri teLine("请输入数字 A:");str ing strN umberA = Console.ReadLine();Console.Wri teLine("请选择运算符号:(+,-, *,/):");str ing str Opera te = Console.ReadLine();Console.WriteLine("请输入数字B:");str ing strN umberB = Console.ReadLine();string strResult ="";switch (strOperate){〃.〃case + :st rResu lt = Conve rt .ToS tr ing(Conve rt .ToDouble(s trN umberA) +Conv ert .ToDouble(s trN umberB));break;〃 〃case —:st rResu lt = Conve rt .ToS tr ing(Conve rt .ToDouble(s trN umberA) —Conv ert .ToDouble(s trN umberB));break;〃,〃case * :st rResu lt = Conve rt .ToS tr ing(Conve rt .ToDouble(s trN umberA) *Conv ert .ToDouble(s trN umberB));break;case / :if (strNumberB != "0")strResult = Convert.ToString(Convert .ToDouble(strNumberA) / Conv ert .ToDouble(s trN umberB));elsest rResult = 〃除数不能为零〃;break;}Console.Wri teLine("结果为:"+ st rResul t);Console.ReadLine();}catch (Exception ex){Console.Wri teLine("您输入有误"+ex.Message);}}}使用面向对象代码容易维护,移植性好第二章 策略模式根据条件实现功能第三章单一职责原则(SRP)就一个类而言,应该仅有一个引起变化的原因 比如功能多,集成多种设备为一身但是没有专业设备沉重,但是如果专业设备 体积缩小了很多倍,功能并不消失,才是两全其美的办法第四章 开放-封闭原则如香港和澳门的回归,实行一国两制方针,并不影响人民的生活第五章 依赖倒转原则1. 高层模块不应该依赖低层模块,两个都应该依赖抽象2. 抽象不应该细节,细节应该依赖抽象[ASD]3. 一个软件实体如果使用的是一个父类的话,那么一定要适用于其子类,而且它 察觉不出父类对象和子类对象的区别,也就是说,在软件里面,把父类都替换 成它的子类,程序行为没有变化。
4. 里氏代换原则:子类行必须能够替换掉它们的父类型第六章 装饰模式1. 把类中的装饰功能从类中搬移去除,这样可以简化原有的类2. 有效的把类和核心职责和装饰功能分开了,而且还可以去除相关类中的重复的装 饰逻辑第七章 代理模式为其他对象提供一种代理以控制对这个对象的访问 代理分为四种:1. 远程代理:也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏 一个对象存在于不同地址的事实[DP]2. 虚拟代理:根据需要创建的开销很大的对象,通过它存放实例化需要很长时间的 真是对象[DP]3. 安全代理:用来控制真是对象访问的权限[DP]4. 智能指引:调用真实对象时,代理处理另外一些事第八章 工厂方法模式1. 简单工厂模式的最大优点就是工厂类中包含了必要的逻辑判断,根据客户端选 择条件多台实例化相关的类,对于客户端来说,去除了具体产品的依赖2. 工厂方法模式:定义一个创建对象的接口,让子类决定实例化哪一个类,工厂 方法是一个类的实例化延迟到其子类第九章 原型模式1. 用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象2. 原型模式就是其实就是从一个对象再创建另外一个可定制的对象,而且不需要 知道任何创建的细节。
3. 一般在初始化的信息不发生变化的情况下,克隆是最好的办法这既隐藏了对 象创建的细节,有对性能大大的提高,而且好不用重新初始化对象,而是动态 的获得对象运行时的状态4. 浅复制与深复制MemberWiseClone()方法:如果字段是值类型的,则对该字段执行逐未复制,如 果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复 本引用同一对象5. 浅复制:被复制的对象所有变量都含有与原来对象相同的值,而所有的对其他 对象相同的值,而所有的对其他的对象的引用都仍然指向原来的对象6. 深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象第十章 模板方法模式1. 既然用了继承,并且这个继承肯定有意义,就应该要成为子类的模板,所有重 复的代码都应该要上升到父类去,而不是让每个子类都去重复2. 当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在 详细的层次上的实现可能不同时我们通常考虑用模板方法模式来处理3. 模板方法模式:定义一个操作的算法的骨架,而将一些步骤延迟到子类中模 板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤4. 模板方法模式是通过把不变行为搬移到超类,去除子类的重复代码来体现它的 优势,还提供了一个很好的代码复用平台。
5. 当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就 会在子类中重复出现通过模板方法模式把这些行为搬移到单一的地方,这样 就帮助子类摆脱重复的不变行为的纠缠第十一章 迪米特法则1. 如果连个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用 如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这 个调用2. 在类的结构设计上,每一个类都应当尽量降低成员的访问权限3. 迪米特法则的根本思想,是强调了类之间的松耦合类之间的耦合越弱,越利 于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及,信息的隐 藏促进了软件的复用第十二章1.第十三章1.2.第十四章1.2.第十五章1.2.外观模式 外观模式,为子系统的一组接口提供一个一致的界面,此模式定义了一个高层 接口,这个接口使得这一子系统更加容易使用 何时使用外观模式:分为三个阶段来说1. 在设计初期阶段,应该要有意识的两个层分离,比如经典的三层架构三层 体现了层与层之间建立外观2. 在开发阶段,子系统往往因为不断的重构烟花而变得越来越复杂,增加外观 可以提供一个简单的接口,减少它们之间的依赖3. 在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了, 这时可以为新系统开发一个外观类,来提供粗糙或高度复杂的遗留代码的比 较清晰简单的接口,让新系统与外观对象交互,外观与遗留代码交互所有复 杂的工作。
建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的 表示的意图时,需要应用于建造者模式,如果用了建造者模式,那么用户就只 需指定需要建造的类型就可以找得到它们,而具体建造的过程和细节就不需知 道了建造者模式是在创建复杂对象的算法应该独立于该对象的组成部分以及它们的 装配方式适用的模式观察者模式 观察者定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题 对象这个主题对象在状态发生变化是,会通知所有观察者的对象,使它们能 够自动更新自己观察者模式的特点:将一个系统分割成一系列相互协作的类有一个很不好的副 作用,那就是需要维护相关对象的移一致性为了维持移植性使得个各类紧密 耦合,给维护带来不便观察者模式的使用方面:1. 当一个对象的改变需要同时改变其他对象的时候,而且还不知道具体有多少 的对象有待改变是,应该考虑使用观察者模式2. 一个抽象模型有两个方面,其中一个方面依赖于另一方面,这时用观察者模 式可以将这两着封装在独立对象中使它们各自独立地改变和复用3. 作用:解除耦合,让耦合的对方都依赖于具体,从而使得各自的变化都不会 影响另一边的变化4. 委托用途:一个委托可以搭载多个方法,所有方法被依次唤起,更重要的是, 它可以使得委托对象搭载的方法并不需要属于同一个类。
5. 委托对象仔仔的所有方法必须具有相同的原形和形式,也就是拥有相同的参 数列表和返回值类型抽象工厂模式 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类 优势:1.易于交换产品系列,只需改变具体工厂即可使用不同产品的配置2. 让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操 作实例,产品的具体类名也被具体工厂的实现分离,不会出现在库户代码中第十六章 状态模式1. 当一个对象的内在状态改变是允许改变其行为,这个对象看起来像是改变了其 类可以把复杂的判断逻辑简化2. 好处与用途消除庞大的条件分支语句,状态模式通过把各种状态转移逻辑分不 到 State 的子类之间,来减少相互间的依赖3. 适用范围:当一个对象的行为取决于它的状态,并且必须在运行时刻根据状态 改变它的行为时,就可以考虑使用状态模式了第十七章 适配器模式1. 将一个类的接口转换成客户希望的另外一个接口Adapter模式使得原本由于接 口不兼容而不能一起工作的那个类可以一起工作2. 系统的数据和行为都正确时,但接口不符时,应该考虑使用适配器,目的是使 控制范围之外的一个原有对象与某个接口匹配适配器模式主要应用于希望复 用一些现存的类,但是接口又与复用环境要求不一致的情况。
3. 适配器适用的场景:1.客户代码可以同一调用同一接口 2.双方都不太容易修改的 时候再使用适配器模式适配第十八章 备忘录模式在不破坏封装性 的前提下,捕获一个对象的内部连接,并在对象之外保存这个状态, 这样以后就可将该对象恢复到原先保存的状态适用场景:1. 功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众 多属性中的一小部分第十九章 组合模式1. 将对象组合成树形结构以表示‘部分-整体'的层次结构组合模式使得用户对单个 对象和组合对象具有一致性2. 透明方式,好处是枝节点和叶节点对于外界没有区别,它们具备完全一致的行为接 口3. 何时使用:需求中是体现部分与整体层次的结构。
