设计模式总结 £神魔★判官ぃ 2022-07-26 01:45 191阅读 0赞 终于完完整整的把设计模式又看了一遍,这几天一直计划要写一篇总结,无奈总被这样或那样的事情打断…再消化一下,回头来把欠的债给还了。 ## 设计模式的分类 ## 总体来说设计模式分为三大类: 创建型模式,共五种:[工厂方法模式][Link 1]、[抽象工厂模式][Link 1]、[单例模式][Link 2]、[建造者模式][Link 3]、[原型模式][Link 4]。 结构型模式,共七种:[适配器模式][Link 5]、[装饰器模式][Link 6]、[代理模式][Link 7]、[外观模式][Link 8]、[桥接模式][Link 9]、[组合模式][Link 10]、[享元模式][Link 11]。 行为型模式,共十一种:[策略模式][Link 12]、[模板方法模式][Link 13]、[观察者模式][Link 14]、迭代子模式、[责任链模式][Link 15]、[命令模式][Link 16]、[备忘录模式][Link 17]、[状态模式][Link 18]、[访问者模式][Link 19]、[中介者模式][Link 20]、解释器模式。 其实还有两类:并发型模式和线程池模式。用一个图片来整体描述一下: ![这里写图片描述][20160406213345978] 在学习设计模式的过程中也顺带系统地回顾了一下面向对象,有关面向对象和设计模式的学习对于编程技能的影响是潜移默化的。在这里就不再累述面向对象,有兴趣的童鞋可以参看LZ的另一篇文章。 ## 设计模式六大原则 ## [设计模式遵循以下六大原则][Link 21]: S:单一职责原则(Single Responsibility Principle, SRP),一个类只能有一个原因使其发生改变,即一个类只承担一个职责。 O:开放-封闭原则(Open-Close Principle, OCP),这里指我们的设计应该针对扩展开放,针对修改关闭,即尽量以扩展的方式来维护系统。 L:里氏替换原则(Liskov Subsititution Principle, LSP),它表示我们可以在代码中使用任意子类来替代父类并且程序不受影响,这样可以保证我们使用“继承”并没有破坏父类。 I:接口隔离原则(Interface Segregation Principle, ISP),客户端不应该依赖于它不需要的接口,两个类之间的依赖应该建立在最小接口的基础上。这条原则的目的是为了让那些使用相同接口的类只需要实现特定必要的一组方法,而不是大量没用的方法。 D:依赖倒置原则(Dependence Inversion Principle, DIP),高层模块不应该依赖于低层模块,两者应该都依赖于抽象;抽象不依赖于细节,而细节应该依赖于抽象。这里主要是提倡“面向接口”编程,而非“面向实现”编程。 L:迪米特法则(Law Of Demeter,LOD),一个对象应该对其他对象保持最少的了解。类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。 ## 23种设计模式简介 ## 工厂方法 意图:定义一个用户创建对象的接口,让子类去决定具体使用哪个类。 适用场合:1)类不知道它所要创建的对象的类信息;2)类希望由它的子类来创建对象。 抽象工厂 意图:提供一个创建一系列相关或者相互依赖的对象的接口,而无须指定它的具体实现类。 适用场合:1)系统不依赖于产品是如何实现的细节;2)系统的产品族大于1,而在运行时刻只需要某一种产品族;3)属于同一个产品族的产品,必须绑在一起使用;4)所有的产品族,可以抽取公共接口 单例 意图:保证一个类只有一个实例,并且在系统全局范围内提供访问切入点。 适用场合:各种“工厂类” 构造者 意图:将复杂对象的构造与表示相分离,使得同样的构造过程可以产生不同的复杂对象。 适用场合:1)需要创建的对象有复杂的内部结构;2)对象的属性之间相互依赖,创建时前后顺序需要指定。 原型 意图:用原型实例指定创建对象的种类,并通过复制原型实例得到对象。 适用场合:1)系统不关心对象创建的细节;2)要实例化的对象的类型是动态加载的;3)类在运行过程中的状态是有限的。 适配器 意图:将一个类的接口转换成用户希望的另一个接口。 适用场合:系统需要使用现有类的功能,但接口不匹配 装饰 意图:动态的为对象添加额外职责 适用场合:1)需要添加对象职责;2)这些职责可以动态添加或者取消;3)添加的职责很多,从而不能用继承实现。 桥接器 意图:将抽象部分与实现部分分离,从而使得它们可以独立变化 适用场合:1)系统需要在组件的抽象化角色与具体化角色之间增加更多的灵活;2)角色的任何变化都不应该影响客户端;3)组件有多个抽象化角色和具体化角色 享元 意图:运用共享技术支持大量细粒度的对象 适用场合:1)系统中有大量对象;2)这些对象占据大量内存;3)对象中的状态可以很好的区分为外部和内部;4)可以按照内部状态将对象分为不同的组;5)对系统来讲,同一个组内的对象是不可分辨的 门面 意图:为系统的一组接口提供一个一致的界面 适用场合:1)为一个复杂的接口提供一个简单界面;2)保持不同子系统的独立性;3)在分层设计中,定义每一层的入口 合成 意图:将对象组装成树状结构以表示“部分-整体”的关系 适用场合:1)系统中的对象之间是“部分-整体”的关系;2)用户不关心“部分”与“整体”之间的区别 代理 意图:为其他对象提供一种代理以控制对该对象的访问 适用场合:对象无法直接访问(远程代理) 职责链 意图:对目标对象实施一系列的操作,并且不希望调用双方和操作之间有耦合关系 适用场合:1)输入对象需要经过一系列处理;2)这些处理需要在运行时指定;3)需要向多个操作发送处理请求;4)这些处理的顺序是可变的 命令 意图:对一类对象公共操作的抽象 适用场合:1)调用者同时和多个执行对象交互;2)需要控制调用本身的生命周期;3)调用可以取消 观察者 意图:定义对象之间一种“一对多”的关系,当一个对象发生改变时,所有和它有依赖关系的对象都会得到通知 适用场合:1)抽象模型有两部分,其中一部分依赖于另一部分;2)一个对象的改变会导致其他很多对象发生改变;3)对象之间是松耦合 访问者 意图:对一组不同类型的元素进行处理 适用场合:1)一个类型需要依赖于多个不同接口的类型;2)需要经常为一个结构相对稳定的对象添加新操作;3)需要用一个独立的类型来组织一批不相干的操作,使用它的类型可以根据应用需要进行定制 模板 意图:定义一个操作步骤的方法骨架,而将其中一些细节的实现放到子类中 适用场合:1)可以抽取方法骨架;2)控制子类的行为,只需要实现特定细节 策略 意图:对算法族进行封装 适用场合:1)完成某项业务有多个算法;2)算法可提取公共接口 解释器 意图:应用或对象与用户狡猾时,采取最具实效性的方式完成 适用场合:1)针对对象的操作有规律可循;2)在执行过程中,对效率要求不高,但对灵活性要求很高 迭代 意图:提供一种方法, 来顺序访问集合中的所有元素 适用场合:1)访问一个聚合对象的内容,而不必暴露其内部实现;2)支持对聚合对象的多种遍历方式;3)为遍历不同的聚合对象提供一致的接口 中介者 意图:避免大量对象之间的紧耦合 适用场合:1)有大量对象彼此依赖(M:N);2)某个类型要依赖于很多其他类型 备忘录 意图:希望备份或者恢复复杂对象的部分属性 适用场合:1)对象的属性比较多,但需要备份恢复的属性比较少;2)对象的状态是支持恢复的 状态 意图:管理对象的多个状态 适用场合:1)对象的行为依赖于当前状态;2)业务处理过程存在多个分支,而且分支会越来越多 [Link 1]: http://blog.csdn.net/lmb55/article/details/46288559 [Link 2]: http://blog.csdn.net/lmb55/article/details/50917342 [Link 3]: http://blog.csdn.net/lmb55/article/details/50990732 [Link 4]: http://blog.csdn.net/lmb55/article/details/50918476 [Link 5]: http://blog.csdn.net/lmb55/article/details/51008762 [Link 6]: http://blog.csdn.net/lmb55/article/details/50985332 [Link 7]: http://blog.csdn.net/lmb55/article/details/50932329 [Link 8]: http://blog.csdn.net/lmb55/article/details/50988427 [Link 9]: http://blog.csdn.net/lmb55/article/details/51044078 [Link 10]: http://blog.csdn.net/lmb55/article/details/51039781 [Link 11]: http://blog.csdn.net/lmb55/article/details/51057570 [Link 12]: http://blog.csdn.net/lmb55/article/details/50967895 [Link 13]: http://blog.csdn.net/lmb55/article/details/50986518 [Link 14]: http://blog.csdn.net/lmb55/article/details/50994653 [Link 15]: http://blog.csdn.net/lmb55/article/details/51052866 [Link 16]: http://blog.csdn.net/lmb55/article/details/51051817 [Link 17]: http://blog.csdn.net/lmb55/article/details/51019191 [Link 18]: http://blog.csdn.net/lmb55/article/details/51000928 [Link 19]: http://blog.csdn.net/lmb55/article/details/51059539 [Link 20]: http://blog.csdn.net/lmb55/article/details/50951348 [20160406213345978]: /images/20220724/b6b873af375d4b28a764cb11d2416b9f.png [Link 21]: http://blog.csdn.net/lmb55/article/details/50933207
相关 设计模式总结 设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接 超、凢脫俗/ 2022年09月23日 05:52/ 0 赞/ 34 阅读
相关 设计模式总结 1.简单工厂模式:由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现 2.策略模式:定义一系列的 旧城等待,/ 2022年08月27日 02:25/ 0 赞/ 191 阅读
相关 设计模式总结 2016-05-08 菜鸟教程 > 更详细的设计模式教程,请点击文末的“阅读原文”。 > > 设计模式教程:http://m.runoob.com/design-patt 不念不忘少年蓝@/ 2022年08月22日 04:58/ 0 赞/ 191 阅读
相关 设计模式总结 终于完完整整的把设计模式又看了一遍,这几天一直计划要写一篇总结,无奈总被这样或那样的事情打断…再消化一下,回头来把欠的债给还了。 设计模式的分类 总体来说设计模式分为三 £神魔★判官ぃ/ 2022年07月26日 01:45/ 0 赞/ 192 阅读
相关 设计模式总结 本文转自 ——[树上月][Link 1]http://www.cnblogs.com/chenssy/p/3357683.html 从七月份开始一直到九月底才看完设计模式 ゝ一世哀愁。/ 2022年07月15日 09:18/ 0 赞/ 222 阅读
相关 设计模式总结 设计模式 什么是设计模式 什么时候使用设计模式 设计模式六大原则 常见设计模式 什么是设计模式 设计模式是软件开发人员在软件开发过程中面临 青旅半醒/ 2022年05月31日 04:50/ 0 赞/ 202 阅读
相关 设计模式总结 建造型模式: 简单工厂:常用,通过enum查找对象,调用其方法使用; 抽象工厂:未曾使用,多个工厂被封装在抽象工厂,挺复杂的; 单例:管理常用 建造者:需要生成的对象具 Dear 丶/ 2022年05月26日 03:19/ 0 赞/ 241 阅读
相关 设计模式总结 从七月份开始一直到九月底才看完设计模式,在这个过程中我不敢说我已经掌握了那本书里面的内容,或者说1/5,没能力说也没有资格说。但是结果不重要,重要的是这个过程我的收获!主要包括 末蓝、/ 2022年04月14日 06:15/ 0 赞/ 236 阅读
相关 设计模式总结 从18年10月份开始学习设计模式,到19年1月底才看完,这篇博文主要总结这个过程中我的收获和一些思考。 我的收获 从刚开始接触Java就听说过设计模式,但是由于自己的 朱雀/ 2022年03月22日 12:46/ 0 赞/ 286 阅读
相关 设计模式总结 首先,可以先参考 文档: https://design-patterns.readthedocs.io/zh\_CN/latest/index.html 创建型: 川长思鸟来/ 2021年12月22日 20:55/ 0 赞/ 273 阅读
还没有评论,来说两句吧...