设计模式(Design Pattern)
定义:它是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
目的:为了可重用代码,让代码更容易被他人理解并保证代码可靠性。
面向对象设计原则:
单一职责 (Single Responsibility Principle,SRP):一个类只负责一个功能领域中的相应职责(一个类因只有一个引起它变化的原因)
开闭原则 (Open-Closed Principle,OCP):一个软件实体应当对扩展开发,对修改关闭。(即软件实体应尽量在不修改原有代码的情况下进行扩展)
里式代换原则(Liskov Substitution Principle,LSP):由于使用基类对象的地方都可以使用子类对象,因此在程序中应尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类类型替换父类类型。(所有引用基类<父类>的地方必须明确的使用其子类的对象)
依赖倒转(Dependency Inversion Principle,DIP):抽象不应该依赖细节,细节应当依赖抽象。(针对接口编程,而不是针对实现编程)
接口隔离(Interface Segregation Principle,ISP):使用多个专门的接口,而不是用单一的总接口(客户端不应该依赖那些它不需要的接口,否则冗余)
合成复用(Composition/Aggregate Reuse Principle,CRP):尽量使用对象组合,而不是继承来达到复用的目的的。(数据库升级 mysql ->oracle)
迪米特法则(Law of Demeter,LoD) :一个软件应可能少地与其他实体发生相互作用 (降低耦合度)
创建型模式、结构性模式、行为型模式
创建型模式:
(1)简单工厂模式(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中创建实例的方法是静态的(static),因此简单工厂又被称为静态工厂方法。(不属于设计模式,如果有很多实现类或新引入实现类时,很麻烦,需改源码,违反了“开闭”原则)
(2)工厂方法模式(Factory Method Pattern):定义一个用户创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到子类(里式代换原则、依赖倒转) 多态工厂模式 <创建既定的,可通过读取配置文件扩展>
(3)抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而不需指定他们的具体的类。(Kit模式)-皮肤库换肤<多个抽象工厂>
(4)单例模式(Singleton Pattern) :确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例,它提供全局访问的方法。(Spring 默认使用单例模式实例化对象)
(5)原型模式(Prototype Pattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。(标签)
(6)建造者模式(Builder Pattern):讲一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
结构类型模式:
(1)适配器模式(Adapter Pattern):将一个接口转换成客户需要的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。 -- 双孔插座与三孔插座 类、对象、接口
(2)桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们可以独立的变化。(柄体Hanle and Body、接口Interface)模式 。 -- 不同的网段,通过桥接互联
(3)组合模式(Composite Pattern):组合多个对象形成树形结构以表示具有“整体-部分”关系的层次结构。组合模式对单个对象和组合对象的使用具有一致性。 -- 树的节点
(4)装饰模式(Decorator Pattern):动态地给一个对象增加一些额外的职责,就增加对象的功能而言,装饰模式比生成子类的实现更为灵活。 --可添加一些验证、日志等
(5) 外观模式(Facade Pattern):为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,
这个接口使得这一子系统更加容易使用。(喝茶:自己在家煮茶喝、到茶馆去喝茶)
(6)享元模式(Flyweight Pattern):运用共享技术有效地把大量细颗粒度的对象复用,系统只是用少量的对象,而这些对象很相似,状态变化很小,可以实现对象的多次复用。 (轻量模式 -- 一盘围棋 位置拜访等)
(7)代理模式(Proxy Pattern):给某一个对象提供一个代理或占位符,并有代理对象来控制对原对象的访问。 -- 中介、代购、快捷键
行为模式:
(1)职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链条传递请求,直到有对象处理它为止。(Servlet 职责链模式)
(2)命令模式(Command Pattern):将请求封装为一个对象,从而让我们可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。(动作Action模式或者事务Transaction模式) 长官下命令,士兵执行
(3)解释器模式(Interpreter Pattern):定义一个语言的文法,并建立一个个解释器来解释该语言中的句子,这里的语言是指使用规定格式和语法代码。 --计算器
(4)迭代器模式(Iterator Pattern):提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor) -- 集合遍历时 Iterator
(5) 中介模式(Mediator Pattern):用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显示地相互引用,从而时期耦合度松散,而且可以独立的改变它们之间的交互。又称调停模式(协调多个对象间的交互)
(6)备忘录模式(Memento Pattern):在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。(撤销功能 --存库,每个版本的状态)
(7)观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生变化时,其相关依赖对象皆得到通知冰杯自动更新。(对象间的联动-RSS订阅)观察者的别名包括发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
(8)状态模式(State Pattern)允许一个对象在其内部状态改变时改变它的行为,对象看起来修改了它的类。其别名为状态对象(Objects for States) --(处理对象的多种状态及其相互转换) 银行用户状态转换问题 大于取款金额
(9)策略模式(Strategy Pattern)定义一个算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化。(算法的封装与切换 --->存款 一般用户、VIP用户)
(10) 模板方法模式(Template Method Pattern) 定义一个操作中算法的框架,而降一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。(银行利息模板)
(11)访问者模式(Visitor Pattern) 提供一个作用于某对象结构中的各个元素的操作表示,它使我们可以在不改变各个元素的类的前提下定义作用于这些元素的新操作。(新增访问者符合开闭原则,新增新元素不符合开闭原则)
参考:https://gof.quanke.name/