且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

设计模式

更新时间:2022-08-12 10:41:51

设计模式(使代码编制真正的工程化)

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

设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多开发人员经过相当长的一段时间的试验和错误总结出来的

设计原则

GOF(四人帮,全拼 Gang of Four)他们所提出的设计模式主要基于以下的面向对象设计原则

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

设计模式的目的是为了代码的复用,增加可维护性。怎么才能实现代码的复用?
面向对象有六个原则(或者说:设计模式的六大原则):
1. 开闭原则(Open Close Principle)
Software entities should be open for extension, but closed for modification.
对扩展开放,对修改关闭
。模块尽量在不修改原代码的情况下进行扩展。实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。(工厂模式)

2. 里氏代换原则(Liskov Substitution Principle)
里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。
里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化(Abstraction)。而基类与子类的继承关系就是抽象化的具体实现(多态Polymorphism),所以里氏代换原则是对实现抽象化的具体步骤的规范。
里氏替换原则,OCP作为OO的高层原则,主张使用“抽象(Abstraction)”和“多态(Polymorphism)”将设计中的静态结构改为动态结构,维持设计的封闭性。“抽象”是语言提供的功能。“多态”由继承语义实现。

Liskov于1987年提出了一个关于继承的原则“Inheritance should ensure that any property proved about supertype objects also holds for subtype objects.”——“继承必须确保超类所拥有的性质在子类中仍然成立。”
也就是说,当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有is-A关系。
该原则称为Liskov Substitution Principle——里氏替换原则。林先生在上课时风趣地称之为“老鼠的儿子会打洞”。

3、依赖倒转原则(Dependence Inversion Principle)
这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。

4、接口隔离原则(Interface Segregation Principle)
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。

5、迪米特法则(最少知道原则)(Demeter Principle)
为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。

6、合成复用原则(Composite Reuse Principle)
原则是尽量使用合成/聚合的方式,而不是使用继承。

设计模式的类型

  1. 创建型(Creational Patterns):这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式 ,而不是使用new运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。

    • 工厂模式(Factory Pattern)
    • 抽象工厂模式(Abstract Factory Pattern)
    • 单例模式(Singleton Pattern)
    • 建造者模式(Builder Pattern)
    • 原型模式(Prototype Pattern)
  2. 结构型(Structural Patterns):
    这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式?

    • 适配器模式(Adapter Pattern)
    • 外观模式(Facade Pattern)
    • 装饰器模式(Decorator Pattern
    • 代理模式(Proxy Pattern))
    • 桥接模式(Bridge Pattern)
    • 组合模式(Composite Pattern)
    • 享元模式(Flyweight Pattern)
    • 过滤器模式(Filter、Criteria Pattern)
  3. 行为型(Behavioral Patterns):
    这些设计模式特别关注对象之间的通信

    • 责任链模式(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 设计模式。

这些设计模式无论怎么变化,必然出现的概念:接口和抽象类、继承和组合、实现或继承,几乎没有新的概念。在这些概念里面转换设计模式的使用场景和目的。

设计模式
23种设计模式(一).png
设计模式
23种设计模式(二).png

设计模式之间的关系:

设计模式
设计模式之间的关系.png

学习顺序:

策略模式 -> 装饰者模式 -> 工厂模式 -> 单件模式 -> 命令模式 -> 适配器模式与外观模式 -> 模板方法模式 -> 迭代器模式与组合模式 -> 状态模式 -> 代理模式