设计模式(1)初识

设计模式(1)

面试问到挺多的,所以准备系统的学一下。

设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。

六大设计原则

单一职责 SRP

一个类只负责一项职责
更加具体的,职责指的是类变化的原因只有一个**。
举个例子:Class1完成T1、T2两个职责,当其中一个职责需要修改时,会影响另外一个职责正常工作。
这样的类我们认为是不好的,类的可读性、可维护性、扩展性都不够好。
但是有一个问题:我们很难定义一个职责到底是什么。

里氏替换原则 LSP

只要父类可以出现的地方就可以出现子类,反之,父类则不一定可以胜任。换句话说:子类可以扩展父类的功能,但不能改变父类原有的功能。

依赖倒置原则 DIP

高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。
简单来说:要面向接口编程,不要面向实现编程。
依赖倒置原则的使用建议:
(1)每个类尽量都有接口或抽象类,或者接口和抽象类两者都具备。

(2)变量的表面类型尽量是接口或抽象类。

(3)任何类都不应该从具体类派生。

(4)尽量不要重写基类的方法。如果基类是一个抽象类,而且这个方法已经实现了,子类尽量不要重写。

接口隔离原则 ISP

客户端不应该依赖它不需要的接口,或者说类间的依赖关系应该建立在最小的接口上。
考虑这样一个问题:
类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法。

接口隔离原则 vs. 单一职责原则:

二者的审视角度不同,单一职责要求的是类和接口职责单一,注重的是职责,这是业务逻辑上的划分,而接口隔离原则要求接口的方法尽量少,它要求”尽量使用多个专门的接口“。

迪米特原则 LoD

一个对象应该对其他对象保持最少的了解。
一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。

这是因为在类和类的关系越密切,耦合度越大,一个类发生改变的时候,对另外一个类的影响也越大。

开放封闭原则 OCP

一个软件实体类,如类、模块和函数应该对扩展开放,对修改关闭。
我们应该尽量 通过扩展实体来解决需求变化,而不是通过修改已有的代码来完成变化。

一句话归纳:

  • 单一职责原则告诉我们实现类要职责单一
  • 里氏替换原则告诉我们不要破坏继承体系
  • 依赖倒置原则告诉我们要面向接口编程
  • 接口隔离原则告诉我们在设计接口的时候要精简单一
  • 迪米特法则告诉我们要降低耦合
  • 开闭原则是总纲,告诉我们要对扩展开放,对修改关闭

23种设计模式、三大类

创建型模式

定义:提供一种创建对象的同时隐藏创建对象逻辑的方式。而不是使用new运算符直接实例化对象。使得程序判断针对某个给定实例需要创建对象时更加灵活。
例子:

  • 工厂模式(Factory Pattern)
  • 抽象工厂模式(Abstract Factory Pattern)
  • 单例模式(Singleton Pattern)
  • 建造者模式(Builder Pattern)
  • 原型模式(Prototype Pattern)

结构型模式

定义:关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。
例子:

  • 适配器模式(Adapter Pattern)
  • 桥接模式(Bridge Pattern)
  • 过滤器模式(Filter、Criteria Pattern)
  • 组合模式(Composite Pattern)
  • 装饰器模式(Decorator Pattern)
  • 外观模式(Facade Pattern)
  • 享元模式(Flyweight Pattern)
  • 代理模式(Proxy Pattern)

行为型模式

定义:关注对象之间的通信。
例子:

  • 责任链模式(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)
posted @ 2022-05-18 18:15  Paranoid5  阅读(23)  评论(0编辑  收藏  举报