0%

设计模式

[TOC]

0. 设计模式简介

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。

设计模式主要是基于以下的面向对象设计原则。

  • 对接口编程而不是对实现编程。
  • 优先使用对象组合而不是继承。

设计模式的分类

根据设计模式的参考书 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 中所提到的,总共有 23 种设计模式。

这些模式可以分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns)。还有,另一类设计模式:J2EE 设计模式。

  • 创建型模式(对象怎么来)
    这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。
  • 结构型模式(对象和谁有关)
    这些模式关注对象之间的组合和关系,旨在解决如何构建灵活且可复用的类和对象结构。
  • 行为型模式(对象与对象在干嘛)
    这些模式关注对象之间的通信和交互,旨在解决对象之间的责任分配和算法的封装。
  • J2EE 模式(对象合起来要干嘛(表现层,文中表示层个人感觉用的不准确)java是面向对象的语言,所以要搞好对象,模式(套路)就是用来更加好的搞对象滴。)
    这些设计模式特别关注表示层。这些模式是由 Sun Java Center 鉴定的。

设计模式的优点

  • 提供了一种共享的设计词汇和概念,使开发人员能够更好地沟通和理解彼此的设计意图。
  • 提供了经过验证的解决方案,可以提高软件的可维护性、可复用性和灵活性。
  • 促进了代码的重用,避免了重复的设计和实现。
  • 通过遵循设计模式,可以减少系统中的错误和问题,提高代码质量。

设计模式的基本原则

  • 单一职责原则(Single Responsibilities Principle):一个类应该只负责一项职责。
  • 开闭原则(Open Close Principle):对扩展开放,对修改关闭。进行拓展的时候,不能去修改原有的代码,实现热插拔,提高扩展性。
  • 里氏代换原则(Liskov Substitution Principle):对开闭原则的补充。实现抽象的规范,实现子父类互相替换。
  • 依赖倒转原则(Dependence Inversion Principle):是开闭原则的基础。针对接口编程,实现开闭原则的基础。
  • 接口隔离原则(Interface Segregation Principle):降低耦合度,接口单独设计,互相隔离。
  • 迪米特法则,又称最少知道原则(Demeter Principle):功能模块尽量独立。
  • 合成复用原则(Composite Reuse Principle):尽量使用聚合,组合,而不是继承。

1. 创建型模式

对象怎么来

示例声明:

  • 工厂模式(Factory Pattern)
    加工工厂:给它“M4A1”,它给你产把警枪,给它“AK47”,你就端了把匪枪。CS里买枪的程序一定是用这个模式的。

  • 抽象工厂模式(Abstract Factory Pattern)

  • 建造者模式(Builder Pattern)
    生产流水线:以前是手工业作坊式的人工单个单个的生产零件然后一步一步组装做,好比有了工业革命,现在都由生产流水线代替了。如要造丰田汽车,先制定汽车的构造如由车胎、方向盘、发动机组成。再以此构造标准生产丰田汽车的车胎、方向盘、发动机。然后进行组装。最后得到丰田汽车;

  • 原型模式(Prototype Pattern)
    印刷术的发明:以前只能临贴抄写费时费力,效率极低,有了印刷术,突突的;

  • 单例模式(Singleton Pattern)
    确保唯一:不是靠new的,是靠instance的,而且要instance地全世界就这么一个实例(这可怜的类,也配叫“类”)。 看SingleTon类代码。

2. 结构型模式

对象和谁有关

  • 适配器模式(Adapter Pattern)
    翻译官:胡哥只会汉语,布什只会美语,翻译官既通汉又通美,Adapter了 ;

  • 装饰器模式(Decorator Pattern)
    装饰:名字可以标识一个人,为了表示对一个人的尊重,一般会称其为“尊敬的”,有了装饰,好看多了;

  • 过滤器模式(Filter、Criteria Pattern)

  • 桥接模式(Bridge Pattern)
    白马非马:马之颜色有黑白,马之性别有公母。我们说”这是马”太抽象,说”这是黑色的公马”又太死板,只有将颜色与性别和马动态组合,”这是(黑色的或白色的)(公或母)马”才显得灵活而飘逸,如此bridge模式精髓得矣。

  • 组合模式(Composite Pattern)
    大家族:子又生孙,孙又生子,子子孙孙,无穷尽也,将众多纷杂的人口组织成一个按辈分排列的大家族即是此模式的实现;

  • 外观模式(Facade Pattern)
    求同存异:高中毕业需读初中和高中,博士也需读初中和高中,因此国家将初中和高中普及成九年制义务教育;

  • 享元模式(Flyweight Pattern)
    一劳永逸:认识三千汉字,可以应付日常读书与写字,可见头脑中存在这个汉字库的重要;

  • 代理模式(Proxy Pattern)
    垂帘听政:犹如清朝康熙年间的四大府臣,很多权利不在皇帝手里,必须通过辅佐大臣去办;

3. 行为型模式

对象与对象在干嘛

  • 责任链模式(Chain of Responsibility Pattern)
    租房:以前为了找房到处打听,效率低且找不到好的房源。现在有了房屋中介,于是向房屋中介提出租房请求,中介提供一个合适的房源,满意则不再请求,不满意继续看房,直到满意为止;

  • 命令模式(Command Pattern)
    借刀杀人:以前是想杀谁就杀,但一段时间后领悟到,长此以往必将结仇太多,于是假手他人,挑拨他人之间的关系从而达到自己的目的;

  • 解释器模式(Interpreter Pattern)
    文言文注释:一段文言文,将它翻译成白话文;

  • 迭代器模式(Iterator Pattern)
    赶尽杀绝:一个一个的搜索,绝不放掉一个;

  • 中介者模式(Mediator Pattern)
    三角债:本来千头万绪的债务关系,忽出来一中介,包揽其一切,于是三角关系变成了独立的三方找第四方中介的关系;

  • 备忘录模式(Memento Pattern)
    有福同享:我有多少,你就有多少;

  • 观察者模式(Observer Pattern)
    看守者:一旦被看守者有什么异常情况,定会及时做出反应;

  • 状态模式(State Pattern)
    进出自由:如一扇门,能进能出,如果有很多人随时进进出出必定显得杂乱而安全,如今设一保安限制其进出,如此各人进出才显得规范;

  • 空对象模式(Null Object Pattern)

  • 策略模式(Strategy Pattern)
    久病成良医:如人生病可以有各种症状,但经过长期摸索,就可以总结出感冒、肺病、肝炎等几种;

  • 模板模式(Template Pattern)
    理论不一定要实践:教练的学生会游泳就行了,至于教练会不会则无关紧要;

  • 访问者模式(Visitor Pattern)
    依法治罪:因张三杀人要被处死,李四偷窃要被罚款。由此势必制定处罚制度,故制定法律写明杀人、放火、偷窃等罪要受什么处罚,经通过后须变动要小。今后有人犯罪不管是谁,按共条例处罚即是,这就是访问者模式诞生的全过程。

4. J2EE模式

对象合起来要干嘛(表现层,文中表示层个人感觉用的不准确)java是面向对象的语言,所以要搞好对象,模式(套路)就是用来更加好的搞对象滴。

MVC 模式(MVC Pattern)

Model-View-Controller(模型-视图-控制器) 模式。用于应用程序的分层开发。

  • Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
  • View(视图) - 视图代表模型包含的数据的可视化。
  • Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。

举例实现

  • 我们将创建一个作为模型的 Student 对象
  • StudentView 是一个把学生详细信息输出到控制台的视图类。
  • StudentController 是负责存储数据到 Student 对象中的控制器类,并相应地更新视图 StudentView。
  • MVCPatternDemo,我们的演示类使用 StudentController 来演示 MVC 模式的用法。

业务代表模式(Business Delegate Pattern)

组合实体模式(Composite Entity Pattern)

数据访问对象模式(Data Access Object Pattern)

前端控制器模式(Front Controller Pattern)

拦截过滤器模式(Intercepting Filter Pattern)

服务定位器模式(Service Locator Pattern)

传输对象模式(Transfer Object Pattern)

参考资料

[1]:https://www.runoob.com/design-pattern/design-pattern-intro.html “参考链接1菜鸟教程”

[2]:https://zhuanlan.zhihu.com/p/570100908 “参考链接2基本原则”