设计模式概述

259 阅读5分钟

1. 设计模式概述

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。
设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。
这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

当前遇到的问题,绝大多数都是前人已经踩过的坑,他们总结了一系列 “套路”,来解决各种各样的问题。
这些套路可以被重用,从而使得代码更容易被理解和拓展,并保证代码的可靠性。

就像是练武,只会一些拳脚功夫是不够的,还需要成体系的内功心法来融会贯通。
这套内功心法会告诉你遇到什么样的敌人应该使用什么招式,也会告诉你应该如何去做才不至于走火入魔。

设计模式的重要性不言而喻,懂的都懂,学就完事了。

2. 设计模式分类

经典的设计模式一共有23种(当然还有其他一些模式),这些设计模式根据目的可以被分为三大类:

(1) 创建型模式

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

单例模式:创建单例对象的最佳方式
工厂模式:由一个工厂类来创建不同类的实例对象
抽象工厂模式:由一个超级工厂类来创建不同的工厂,从而生产产品
建造者模式:使用多个简单的组件构造一个复杂的组件
原型模式:由一个原型对象,快速拷贝出新对象

(2) 结构型模式

这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。

代理模式:使用一个代理类来实现被代理类的功能
适配器模式:作为两个不兼容的接口之间的桥梁,将一个接口转变成另一个接口
桥接模式:将抽象化与实现化解耦,使得二者可以独立变化
装饰器模式:对一个对象进行装饰,使它拥有新的功能
外观模式:使用一个外观类,提供了客户端请求的简化方法和对现有系统类方法的委托调用
享元模式:减少对象创建:有可用对象则直接返回,没有才进行创建
组合模式:依据树形结构来组合对象,用来表示部分以及整体层次

(3) 行为型模式

这些设计模式特别关注对象之间的通信。作用于类或对象之间相互协作共同完成单个对象无法单独完成的任务,以及怎样分配职责。

责任链模式:责任链模式为请求创建了一个接收者对象的链,对请求的发送者和接收者进行解耦
命令模式:将请求封装为命令对象,并传给相应的调用对象来执行该命令
解释器模式:解释器模式提供了评估语言的语法或表达式的方式
迭代器模式:可以对聚合对象进行迭代
中介者模式:使用中介类,来实现对象与对象之间的松耦合
备忘录模式:保存一个对象的某个状态,以便在适当的时候恢复对象。
观察者模式:当一个对象被修改时,则会自动通知依赖它的对象
状态模式:类的行为是基于它的状态改变
策略模式:按照不同的策略,调用不同的逻辑
模板模式:一个抽象类公开定义了执行它的方法的方式/模板
访问者模式:在访问者模式中,使用了一个访问者类,它改变了元素类的执行算法

3. 设计模式六大原则

(1) 单一职责原则(Single Responsibility Principle, SRP)

对于一个类而言,应该只有一个引起它变化的原因。

也就是说,一个类只负责一个功能,不能因为每次引入新功能,都要去修改这个类,除非是这个类本身发生了改变。

(2) 开闭原则(Open-Closed Principle, OCP)

一个软件实体应当对扩展开放,对修改关闭

也就是说,尽量通过继承抽象类或者实现接口的方式来进行功能增强,而不是直接对原有代码进行修改。

(3) 里氏替换原则(Liskov Substitution Principle, LSP)

所有引用基类(父类)的地方必须能透明地使用其子类的对象。

也就是说,应该能够把使用父类的地方,直接替换成子类。 这就要求尽量把父类设计为抽象类或者接口,且不要去重写父类中的方法,使其功能在所有子类中都相同。

(4) 依赖倒置原则(Dependence Inversion Principle,DIP)

高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。

也就是说,要面向接口编程,不要面向实现编程。

(5) 接口隔离原则(Interface Segregation Principle, ISP)

使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。

也就是说,接口也是需要单一职责的,不要把不相关的方法都声明在一个接口中,否则类就得实现这些它并不关心的方法。

(6) 迪米特法则(Law of Demeter, LoD)

一个软件实体应当尽可能少地与其他实体发生相互作用。

也就是说,通过引入一个合理的第三者来降低现有对象之间的耦合。
每个类的成员变量和方法,能不public就不public,避免被随意引用。

参考引用

设计模式简介:www.runoob.com/design-patt…