深入浅出—设计模式重要原则

本文详细阐述了设计模式中的六大基本原则:单一职责原则、开放封闭原则、依赖倒置原则、里氏替换原则、迪米特法则及合成聚合复用原则,并通过生活实例帮助读者更好地理解和应用这些原则。

      学习设计模式前,自己就在想这么一厚本书从哪下手比较好,俗话说:万变不离其宗,这个宗就是我后来想到的是学习设计模式的原则,因为所有的模式都伴随着原则和面向对象的三大属性:继承、多态、封装。在各个原则之间也有着相互紧密的关系,都有着藕断丝连的联系,知识间都是相同的,只是我们占的角度不同、学习点不同、认识的不同、理解的深度不同,下面带着大家一起学习重要的原则,为接下来学习多种模式打下良好的原则基础:

 

1:单一职责原则(Single Responsibilit Principle),简称:SRP

      SRP准确解释:就一个类而言,应该仅有一个引起它变化的原因,如果一个类承担的职责过多,就等于把这些职责都耦合在一起,一个职责的变化可能会消弱或者抑制这个类完成其他职责的能力,这种耦合会导致脆弱的设计,当变化发生时,设计会遭到意想不到的破坏,当然软件设计真正要做的许多内容,就是发现职责并把这些职责相互分离,

     生活实例1:软件工程中的高内聚低耦合是软件设计的标准,我们要协调后各个功能之间的关系,各自负责好自己的功能,管好自己的事就好,例如:台式机主机箱的各个零部件就是很好的体现着以原则,这样电脑出现问题后我们很容易的去维护。

 

2:开发—封闭原则(The Open_Closeed Principle,简称OCP)

      OCP是说软件实体(类、模块、函数等),应该可以扩展,但是不可修改,特征:对于扩展是开发的(Open for extension),另一个是说对于更改是封闭的(Closed for modification),在设计的时候,时刻要考虑,尽量让这个类是足够就好了,写好了就不要去修改了。

     如果新的需求来了,我们需要增加一些类即可,不允许修改的是抽象的类或者接口,允许扩展的是具体的实现类,抽象类和接口在"开-闭"原则中扮演着极其重要的角色,即要预知可能变化的需求.又预见所有可能已知的扩展,所以在这里"抽象化"是关键!

     无论模块时多么封闭,都会存在以下无法封闭的变化,既然不可能完全封闭,可以通过构造抽象来隔离这些变化。

     OCP是面向对象设计的核心所在,遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护性、可扩展性、可复用性、灵活性,但是我们应该把握好一个度就是不抽象和抽象本身一样重要。

 

3:依赖倒转原则(Dependence Inversion Principle简称:DIP)

      依赖倒转原则是抽象不应该依赖细节,细节应该依赖抽象,说白了,就是对接口编程,不要对实现编程,物理主板、CPU、内存、硬盘都要是针对接口设计的,总的来说:高层模块不应该依赖低层模块,两个都应该依赖对象,抽象不应该依赖细节,细节应该依赖抽象。具体一点就是接口或抽象类,只有接口稳定,那么任何一个的更改对不用担心其他受到影响,这使得无论高层模块还是低层模块都可以很容易的实现复用,这才是最好的方法。

       生活实例1:米老师有事情想通知给大家,不能够给每个人说一遍吧,那样太不现实了,所以通过各期的班长,就很容易的下达通知,老师是要依赖各期的班长,也就是说细节要依赖抽象。

       生活实例2:工厂里要批量组装电脑,工人们都是依据图纸来学习的,也是细节依赖抽象的。

 

4:里氏代换原则(Liskov Substitution Principle,简称LSP)

 

     这一原则是对继承的一种约束,是一个软件实体如果使用的是一个父类的话,那么一定使用于其子类,而且它察觉不出父类对象和子类对象的区别,也就是说,在软件里面,把父类都替换成它的子类,程序的行为没有变化,简而言之,子类型必须替换掉它们的父类型。

     这个原则,使得继承复用成为了可能,只有当子类可以替换掉父类,软件单位功能不受影响时,父类才能真正的被复用,而子类能够在父类的基础上增加新的行为,子类的可替换性使得使用父类类型的模块在无需修改的情况下就可以扩展

 

 

5:迪米特法则(Law of Demeter,简称:LoD)

        迪米特法则:如果两个类不必彼此之间通信,那么这两个类就不应当发生直接的相互作用,如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三周转发这个调用。

       迪米特法首先强调的前提是在类的结构设计上,每一个类应当尽量降低成员的访问权限,也就是说,一个类包装好自己的private方法,不需要让别的类知道的字段或行为就不要公开,迪米特的根本思想是强调了类之间的耦合,类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及,即信息的隐藏促进了软件的复用

 

      生活实例1:A依赖B,B依赖C,,当修改A类时要考虑对类B的影响,而B类受到的影响要考虑对C类的影响,等等,如果很多类之间这么的关联,什么时候是个尽头

 

      生活实例2:就是我们程序好中模块与模块之间的实现关系时,通过接口传递消息,这就是迪米特法则的很好体现

 

 

6:合成和聚合复用原则(Composition Aggregation Principle,简称:CARP)

      合成(Composition)和聚合(Aggregation)都是关联(Association)的特殊种类。聚合表示整体和部分的关系,表示“拥有”;合成则是一种更强的“拥有”,部分和整体的生命周期一样。合成的新的对象完全支配其组成部分,包括它们的创建和湮灭等。一个合成关系的成分对象是不能与另一个合成关系共享的。

     合成聚合是has a de 的关系,继承是is a 的关系,由于继承是、中父类变化,子类比变,所以我们一般不要用继承,优先使用合成聚合复用原则,有注意保持每个类的封装,降低继承的层次。

 

    

   总结:相信学习这些原则和面向对象的特性,以此作为利剑来促使我们不断的深入理解每个模式,这样就会顺水推舟,学习模式会很轻松,因为每个模式里都体现出我们的原则,设计原则是为了我们更好地理解模式。


     一句话:解耦才是硬道理

书籍目录 目录 第1章基本概念 1 1.1什么是设计模式 2 1.2设计模式的作用 3 1.3GRASP模式的分类 4 1.4GoF设计模式的分类 4 1.5模式的学习阶段 6 第2章负责任地设计对象——GRASP 9 2.1InformationExpert(信息专家) 11 2.2Creator(创造者) 13 2.3LowCoupling(低耦合) 14 2.4HighCohesion(高内聚) 15 2.5Controller(控制器) 17 2.6Polymorphism(多态) 18 2.7PureFabrication(纯虚构) 19 2.8Indirection(间接) 20 2.9ProtectedVariations(受保护变化) 21 第3章GoF-CreationalDesignPatterns创建型设计模式 23 3.1SimpleFactoryPattern(简单工厂模式) 24 3.1.1定义 24 3.1.2现实例子——国旗生产厂 26 3.1.3C#实例1——电子付款系统 26 3.1.4C#实例2——学校登录系统 29 3.1.5Java实例——手机简单工厂 32 3.1.6优势和缺陷 34 3.1.7应用情景 34 3.2FactoryMethodPattern(工厂方法模式) 35 3.2.1定义 35 3.2.2现实例子——兵工厂 36 3.2.3C#实例——多文档系统 37 3.2.4Java实例——扩展了的手机工厂 41 3.2.5优势和缺陷 44 3.2.6应用情景 44 3.3AbstractFactoryPattern(抽象工厂模式) 45 3.3.1定义 45 3.3.2现实例子——扩展了的兵工厂 48 3.3.3C#实例——大陆生态系统 49 3.3.4Java实例——电脑产品 52 3.3.5优势和缺陷 57 3.3.6应用情景 57 3.4BuilderPattern(建造者模式) 58 3.4.1定义 58 3.4.2现实例子——快餐店 60 3.4.3C#实例——车间造车 61 3.4.4Java实例——建造房屋 65 3.4.5优势和缺陷 69 3.4.6应用情景 70 3.5PrototypePattern(原型模式) 70 3.5.1定义 70 3.5.2现实中的拷贝-粘贴 71 3.5.3C#实例——颜色管理器 72 3.5.4Java实例——简单ToolBar 74 3.5.5ShallowCopy与DeepCopy 76 3.5.6优势和缺陷 82 3.5.7应用情景 82 3.6SingletonPattern(单例模式) 82 3.6.1定义 82 3.6.2现?抵械牡ダ??猈indowsTaskManager 83 3.6.3C#实例——负载均衡控制器 84 3.6.4Java实例——系统日志 86 3.6.5DoubleCheckLocking(双检锁) 89 3.6.6优势和缺陷 93 3.6.7应用情景 93 第4章GoF-StructuralDesignPatterns结构型设计模式 95 4.1AdapterPattern(适配器模式) 96 4.1.1定义 96 4.1.2现实中的实例——电脑电源适配器 97 4.1.3C#实例——化学数据银行 98 4.1.4Java实例——清洁系统 102 4.1.5优势和缺陷 104 4.1.6应用情景 104 4.2BridgePattern(桥接模式) 104 4.2.1定义 104 4.2.2现实中的实例——男人的约会 106 4.2.3C#实例——商业对象与数据对象 107 4.2.4Java实例——不同系统的图像处理 112 4.2.5优势和缺陷 114 4.2.6应用情景 115 4.3CompositePattern(组合模式) 115 4.3.1定义 115 4.3.2组合模式的现实应用——资源管理器 117 4.3.3C#实例——图形树状对象结构 118 4.3.4Java实例——文档格式化 121 4.3.5优势和缺陷 124 4.3.6应用情景 125 4.4DecoratorPattern(装饰模式) 125 4.4.1定义 125 4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 4.5FacadePattern(外观模式) 134 4.5.1定义 134 4.5.2现实中的实例——顾客服务员 135 4.5.3C#实例——抵押申请审核 136 4.5.4Java实例——冲茶 139 4.5.5优势和缺陷 143 4.5.6应用情景 143 4.6FlyweightPattern(轻量级模式) 144 4.6.1定义 144 4.6.2实例——中游的四国军棋 146 4.6.3C#实例——文档编辑器 147 4.6.4Java实例——装载图像 151 4.6.5优势和缺陷 154 4.6.6应用情景 154 4.7ProxyPattern(代理模式) 154 4.7.1定义 154 4.7.2几个现实中的实例 156 4.7.3C#实例——数学代理 158 4.7.4Java实例——Socket回声 160 4.7.5优势和缺陷 165 4.7.6应用情景 165 第5章GoF-BehavioralDesignPatterns行为型设计模式 167 5.1ChainofResponsibility(责任链模式) 168 5.1.1定义 168 5.1.2现实中的实例——军情的传递 169 5.1.3C#实例——采购分级审批 170 5.1.4Java实例——智能大厦安全系统 174 5.1.5优势和缺陷 178 5.1.6应用情景 178 5.2CommandPattern(命令模式) 179 5.2.1定义 179 5.2.2现实中的实例——餐馆订菜 180 5.2.3C#实例——简单计算器 181 5.2.4Java实例——总开关 185 5.2.5优势和缺陷 189 5.2.6应用情景 189 5.3InterpreterPattern(解释器模式) 190 5.3.1定义 190 5.3.2现实示例——音乐符号 192 5.3.3C#实例——中国金钱大写转换 192 5.3.4Java实例——自定义程序解释器 197 5.3.5优势和缺陷 204 5.3.6应用情景 205 5.4IteratorPattern(迭代器模式) 205 5.4.1定义 205 5.4.2现实示例——电视节目选择器 206 5.4.3C#实例——遍历例子 207 5.4.4Java实例——两个迭代器 211 5.4.5优势和缺陷 213 5.4.6应用情景 214 5.5MediatorPattern(中介者模式) 214 5.5.1定义 214 5.5.2现实示例——机场控制塔 215 5.5.3C#实例——聊天室 216 5.5.4Java实例——多线程通信 220 5.5.5优势和缺陷 223 5.5.6应用情景 223 5.6MementoPattern(备忘录模式) 223 5.6.1定义 223 5.6.2现实示例——音响均衡器 226 5.6.3C#实例——销售目标 226 5.6.4Java实例——多次Undo(取消)操作 231 5.6.5优势和缺陷 236 5.6.6应用情景 236 5.7ObserverPattern(观察者模式) 236 5.7.1定义 236 5.7.2现实例子——拉登现身了 238 5.7.3C#实例——猫和老鼠 238 5.7.4C#实例——股票变化 241 5.7.5Java实例——监控系统 245 5.7.6优势和缺陷 248 5.7.7应用情景 248 5.8StatePattern(状态模式) 248 5.8.1定义 248 5.8.2现实例子——心情好坏 250 5.8.3C#实例——账户分类 250 5.8.4Java实例——汽车的变速档 258 5.8.5优势和缺陷 261 5.8.6应用情景 261 5.9StrategyPattern(策略模式) 261 5.9.1定义 261 5.9.2现实例子——去机场的策略 263 5.9.3C#实例——排序方法 263 5.9.4Java实例——多格式输出 266 5.9.5优势和缺陷 272 5.9.6应用情景 272 5.10TemplateMethodPattern(模板方法模式) 272 5.10.1定义 272 5.10.2现实例子——厨师烹调 274 5.10.3C#实例——数据库连接模板 274 5.10.4Java实例——冒泡排序模板 277 5.10.5优势和缺陷 280 5.10.6应用情景 280 5.11VisitorPattern(访问者模式) 280 5.11.1定义 280 5.11.2现实例子——收银员收银计费 282 5.11.3C#实例——人事评估 283 5.11.4Java实例——维修工程师检查车辆 287 5.11.5优势和缺陷 291 5.11.6应用情??291 第6章模式的综合应用 293 6.1Java实例——扩展的日志记录器 294 6.2C#实例——存储分析器 298 6.3用模式生成程序架构 316 附录1自测题 321 附录2自测题答案 331 参考文献 337
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值