Design Patterns
Love is life in its fulness like the cup with its wine. ——爱就是杯中酒般丰富的生活。
语言结构
如果只能为软件工程学科甚或计算机学科选择一门课程,我会选择数据结构,狭义的数据结构包含顺序结构、树形结构和图形结构,然而这三种基础结构囊括了几乎囊括了整个软件工程相关的理论、技术、实践、工具链和方法论。其起点要追溯到结构主义,结构主义起源于20世纪初,诞生于语言学的研究中,瑞士语言学家Ferdinand de Saussure在《一般语言学课程》(Course in General Linguistics)中提出了一种新的语言学理论,强调语言是由一系列差异性元素构成的系统,而这些差异性元素构成了语言的结构。——编程语言是一种语言,所以他们自然的符合结构主义的理论。
结构主义
结构主义是一种社会科学和人文学科中的理论和方法论,主要关注社会、文化和语言等现象的结构和关系。特征主要有以下几点:
- 关注结构: 结构主义强调社会现象中的结构和模式,而不是个别行为或事件。它关注组成系统的元素之间的关系,以及这些关系如何形成更大的结构。
- 普遍性原则: 结构主义认为存在普遍性的原则和结构,这些原则适用于各种文化、社会和语言。它试图寻找普遍存在的模式,而不是强调特定时空下的差异。
- 符号系统: 结构主义将社会和文化看作一种符号系统,其中符号(如语言、符号、习惯等)具有特定的含义,并通过一系列规则进行组织。
- 语言学基础: 结构主义的起源可以追溯到语言学,特别是西班牙学者Ferdinand de Saussure的语言学理论。Saussure强调语言的结构性质,并将语言视为一种系统,其中词语的意义是通过相互关系而不是单独存在的。
- 对抽象的关注: 结构主义通常关注抽象的概念和模式,而不是特定的个体或事件。它试图找到规律和普遍性,以解释复杂的社会和文化现象。
设计模式的分类
模式即结构,设计模式是开发者在面向对象编程实践中经验积累的成果,面向对象因其通俗性和简单性在过去几十年大放异彩,由GoF总结的设计模式旨在利用面向对象的优点,更重要的是通过设计良好的代码结构对抗面向对象的有限性(复杂性管理) 。OOP总计定义了23种设计模式,要减少模式便于理解就要从比抽象更高一层抽象的角度
- 创建型模式:对象的创建
- 结构刑模式:对象间关系(静态)
- 行为型模式:对象间行为(动态)
一图看尽长安花
一言以蔽之
- 单例模式(Singleton Pattern): 保证一个类只有一个实例,并提供全局访问点。
- 工厂模式(Factory Pattern): 定义一个接口用于创建对象,但由子类决定实例化哪个类。
- 抽象工厂模式(Abstract Factory Pattern): 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
- 建造者模式(Builder Pattern): 将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示。
- 原型模式(Prototype Pattern): 用原型实例指定创建对象的种类,并通过复制这些原型创建新的对象。
- 适配器模式(Adapter Pattern): 将一个类的接口转换成客户希望的另一个接口。
- 装饰者模式(Decorator Pattern): 动态地给一个对象添加一些额外的职责。
- 代理模式(Proxy Pattern): 为其他对象提供一种代理以控制对这个对象的访问。
- 外观模式(Facade Pattern): 提供了一个高层次的接口,使得子系统更容易使用。
- 桥接模式(Bridge Pattern): 将抽象部分与它的实现部分分离,使它们都可以独立地变化。
- 组合模式(Composite Pattern): 将对象组合成树形结构以表示部分-整体的层次结构。
- 享元模式(Flyweight Pattern): 使用共享对象来支持大量细粒度的对象。
- 策略模式(Strategy Pattern): 定义一系列算法,将每个算法封装起来,并使它们可以互换。
- 模板方法模式(Template Method Pattern): 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
- 观察者模式(Observer Pattern): 定义了对象之间的一对多依赖关系,使得一个对象的状态改变可以通知其他对象。
- 迭代器模式(Iterator Pattern): 提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露该对象的内部表示。
- 备忘录模式(Memento Pattern): 在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
- 状态模式(State Pattern): 允许对象在其内部状态改变时改变它的行为。
- 命令模式(Command Pattern): 将请求封装成对象,使得可以用不同的请求对客户进行参数化。
- 责任链模式(Chain of Responsibility Pattern): 为请求创建一个接收者对象的链,使得每个接收者都包含对另一个接收者的引用。
- 中介者模式(Mediator Pattern): 用一个中介对象来封装一系列的对象交互。
- 访问者模式(Visitor Pattern): 表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。
- 解释器模式(Interpreter Pattern): 定义一种语言的文法,并提供一个解释器来解释该语言中的句子,使得用户能够按照定义的语法规则解释和执行特定的操作。(极少用到)
结语
符合设计模式的代码不是一蹴而就的,与设计模式相关的主题是重构,有一个概念是Refactor to Pattern,即向着模式重构,但是模式也不宜乱用,设计模式结构化管理代码的目的一定是保持简单性和低成本的扩展性。
问:为什么越简单越好?
答:因为人的局限性
问:为什么要强调扩展性?
答:软件不是一成不变的,迭代升级的成本某种程度可以由代码量反应,结构可以帮助用尽可能少的代码实现功能扩展,降低开发成本
问:有没有一种模式适用一切?
答:没有,只能有针对性选择合适的
问:真的没有吗?
答:也可以有——One Pattern:保持理性/正义