设计模式 - 概述
设计模式
设计模式这一概念最早起源于建筑领域,是Christopher Alexander在其著作《建筑模式语言》中首次提及, 而后经过岁月的洗礼与沉淀,由我们的前辈们引入到软件设计领域, 其作为一种设计问题的思想,经过众多软件开发前辈们经过反复的实践和踩坑之后得到的经验,逐渐趋于成熟和完善。应用这种经验可以试我们的代码更加规范, 重用度更高,增加了代码的可读性,可靠性和鲁棒性 。便于更好的开发和维护。学习这些模式也可以有助于开发经验不足的开发人员用一种跟简单快捷的方式来设计软件。其核心偏向与设计问题,这是与算法存在不同的地方, 算法核心是解决问题。
设计模式可归纳为创建型,行为型和结构型设计模式
下面列出了常见的设计模式以及所属分类,后面会持续更新相关模式的详细文章
类别 | 描述 | 包含设计模式 |
创建型 | 这种模式提供了一种在创建对象的同时隐藏了对象创建逻辑的方式, 而不是通过简单的new运算符直接实例化对象,使程序在判断针对某个指定的实例需要创建哪些对象更加灵活 |
简单工厂模式(Simple Factory Pattern) 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Single Factory Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern) |
行为型 | 这种模式是为了满足特定行为而设计的解决方案,关注类和对象的组合 |
适配器模式(Adaptor Pattern) 桥接模式(Bridge Pattern) 过滤器模式(Filter 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) |
设计模式之六大原则
名称 | 描述 |
单一职责原则 | Single Responsibility Principle, 简称SRP. 每个类应该实现单一职责, 换句话说就是有且仅有一个原因引起类的变更 |
里氏替换原则 |
为良好的定义继承定义了一个规范 1. 子类必须完全实现父类的方法 2. 子类可以有自己的特性 3. 覆盖或实现父类的方法时, 输入参数可以被放大 4. 覆盖或实现父类的方法时,输出结果可以被缩小 |
依赖倒置原则 |
Dependency Inversion Principle, DIP. 是面向接口编程的设计原则 1. 高层模块不应依赖低层模块 2. 抽象不应该依赖细节, 细节应该依赖抽象. 具体表现就是抽象类或接口不应依赖实现类, 实现类应依赖接口或抽象类 三种写法 1. 构造函数依赖 2. 定义抽象方法构造依赖对象 3. 接口声明依赖对象 |
接口隔离原则 |
它所描述的类间的依赖关系应该建立在最小的接口上, 客户端不应该依赖它不需要的接口 要求接口满足以下规范 1. 接口尽量小. 接口应尽量细粒度设计, 增加接口灵活性 2. 接口要高内聚. 就是提高接口, 类, 模块的处理能力. 尽量少的减少对外交互 3. 定制服务. 接口可以为客户端单独定制服务. 可以为不同的客户提供不同的接口. 比如说, 一个接口只想给内部人员使用, 对外部隐藏, 那就需要定制服务了 4. 保持有限的接口设计. 接口设计灵活可能带来结构的复杂化, 增加开发和维护难度 |
迪米特法则 | Law of Demeter, Lod 也叫最少知识原则. 描述的是一个对象应该对自己需要调用的对象类知道的最少. 只需要关心调用, 不需要关心实现 |
开闭原则 | 广义的解释就是对扩展开放, 对修改关闭. 这是一个乐观的原则, 积极的拥抱变化, 假设变化必然发生, 应尽量通过扩展软件的行为去实现这些变化, 而不是通过修改已有的代码来完成变化. 一般是通过新增子类等方式覆盖父类方法来实现扩展 |
设计模式存在的六种关系
关系名称 | UML符号标识 | 描述 |
泛化关系 | 带三角箭头的实线,箭头指向父类 | 属于类的继承关系,指明子类如何特化父类的所有特征和行为 |
依赖关系 | 带箭头的虚线,箭头指向独立的类 | 描述的是类的使用存在依赖关系,也叫使用关系(USE-A),表示两个活动中一个活动的变更会影响另一个活动。例如一个类用另一个类作为其数据成员,一个类向另一个类发消息等 |
实现关系 | 带三角箭头的虚线,箭头指向接口 | 描述了类是接口的全部实现 |
组合关系 | 带实心菱形的实线,菱形指向整体,箭头指向部分 | 描述的是整体与部分的关系,部分不能离开整体而单独存在。例如公司和部门,部门不能离开公司而单独存在,是关联关系的一种 |
关联关系 | 带普通箭头的实线,箭头指向被关联者 | 描述的是两个类元之间的关系,例如类指向用例,水指向气候,学生指向课程等 |
聚合关系 | 带空心菱形的实心线,菱形指向整体,箭头指向部分 | 描述的整体与部分的关系,部分能离开整体而单独存在。例如自行车和车座,电脑和显示器等 |
强弱顺序:泛化 > 实现 > 组合 > 聚合 > 关联 > 依赖