开篇导语
最近在软件开发工程中越发觉得自己写代码的水平难以提升,不知道在哪看到的一句话“写好代码不仅仅是抽象两个方法就完了,要设计一套优美的代码,要遵循设计模式才行”。这里我们觉得不是说所有的软件代码都是如此,只是针对现在大部分软件而言,因为现在大部分系统或者说大部分语法都是面向对象的。
打算总结一下学习设计模式的过程以及资料,虽然这方面的资料非常多,但是自己去总结一遍,完全会有不同的理解与收获,所以不管学习什么内容,都建议同学们去自己亲手过一遍。
学习设计模式至少应该掌握如下几点:
1.这个设计模式的意图是什么,要解决什么问题,什么时候可以使用它
2.它是如何解决的,掌握它的结构图,记住它的关键代码
3.能够想到至少两个它的应用实例,一个生活中的,一个软件中的,
4.这个模式的优缺点是什么,在使用时要注意什么
设计模式的上层境界是:“手中无模式,心中有模式”。也就是传说中的“无招胜有招”。
概述
模式
讲设计模式之前先说说什么是模式:模式是在特定环境下人们解决某类重复出现问题的一套成功或有小的解决方案。模式最初起源于建筑学,用来规律具有相似规律的问题,当被引入软件工程领域之后,发展到今天已经逐渐趋于成熟。软件模式并非仅限于设计模式,还包括架构模式、分析模式和过程模式等。软件模式的基础结构主要由四部分构成:
1.问题描述【待解决的问题是什么】
2.前提条件【在何种环境或约束条件下使用】
3.解法【如何解决】
4.效果【有哪些优缺点】
设计模式
设计模式的一般定义:设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且保证代码可靠性。
其中关键要素是:模式名称、问题、解决方案和效果。设计模式可分为创建型(Creational),结构型(Structural),行为型(Behavioral)。在GoF23种设计模式中包含5种创建型、7种结构型、11种行为型。
5种创建型
模式名称 | 学习难度 | 使用频率 |
---|---|---|
单例模式 (Singleton Pattern) | ⭐ | ⭐⭐⭐⭐ |
简单工厂模式 (Simple Factory Pattern)(太简单了一般不算在五种之中) | ⭐⭐ | ⭐⭐⭐ |
工厂方法模式 (Factory Method Pattern) | ⭐⭐ | ⭐⭐⭐⭐⭐ |
抽象工厂模式 ( Abstract Factory Pattern) | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
原型模式 (Prototype Pattern) | ⭐⭐⭐ | ⭐⭐⭐ |
建造者模式 (Builder Pattern) | ⭐⭐⭐⭐ | ⭐⭐ |
7种结构型
模式名称 | 学习难度 | 使用频率 |
---|---|---|
适配器模式 (Adapter Pattern) | ⭐⭐ | ⭐⭐⭐⭐ |
桥接模式 (Bridge Pattern) | ⭐⭐⭐ | ⭐⭐⭐ |
组合模式 (Composite Pattern) | ⭐⭐⭐ | ⭐⭐⭐⭐ |
装饰模式 ( Decorator Pattern) | ⭐⭐⭐ | ⭐⭐⭐ |
外观模式 (Facade Pattern) | ⭐ | ⭐⭐⭐⭐⭐ |
享元模式 (Flyweight Pattern) | ⭐⭐⭐⭐ | ⭐ |
代理模式 (Proxy Pattern) | ⭐⭐⭐ | ⭐⭐⭐⭐ |
11种行为型
模式名称 | 学习难度 | 使用频率 |
---|---|---|
责任链模式 (Chain of Responsibility Pattern) | ⭐⭐⭐ | ⭐⭐ |
命令模式 (Command Pattern) | ⭐⭐⭐ | ⭐⭐⭐⭐ |
解释器模式 (Interpreter Pattern) | ⭐⭐⭐⭐⭐ | ⭐ |
迭代器模式 ( Iterrator Pattern) | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
中介者模式 (Mediator Pattern) | ⭐⭐⭐ | ⭐⭐ |
备忘录模式 (Memento Pattern) | ⭐⭐ | ⭐⭐ |
观察者模式 (Observer Pattern) | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
状态模式 (State Pattern) | ⭐⭐⭐ | ⭐⭐⭐ |
策略模式 (Strategy Pattern) | ⭐ | ⭐⭐⭐⭐ |
模板方法模式 (Template Method Pattern) | ⭐⭐ | ⭐⭐⭐ |
访问者模式 (Visitor Pattern) | ⭐⭐⭐ ⭐ | ⭐ |
专栏目录
废话不多说,直接进入正题
参考博客:
主要内容目录:
面向对象设计七大原则
也有说法是六大原则,因为所有的原则都围绕其中一个原则来服务,为了满足一个总原则-开闭原则。
开闭原则是指:对扩展开放,对修改封闭。
在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。
-
单一职责原则(Single Responsibility Principle)
不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责,否则就应该把类拆分。 -
里氏替换原则(Liskov Substitution Principle)
所有引用基类对象的地方能够透明地使用其子类对象。
里氏替换原则是对“开-闭”原则的补充。实现“开闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。里氏替换原则中,子类对父类的方法尽量不要重写和重载。因为父类代表了定义好的结构,通过这个规范的接口与外界交互,子类不应该随便破坏它。 -
依赖倒转原则(Dependence Inversion Principle)
面向接口编程,依赖于抽象而不依赖于具体。写代码时用到具体类时,不与具体类交互,而与具体类的上层接口交互。 -
接口隔离原则(Interface Segregation Principle)
每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分。使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好。 -
合成复用原则(Composite Reuse Principle)
尽量首先使用合成/聚合的方式,而不是使用继承。
如果一个类是另一个类的“一种”(Is-A),应该使用继承,如果一个类具有某一项责任(Has-A)应该使用合成/聚合。 -
迪米特法则(Demeter Principle)
一个软件实体应当尽可能少地与其他实体发生相互作用。
合理引用第三角色来维系多个类的相互作用关系。