设计模式(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)