目录
什么是设计模式
设计模式(Design pattern) :由软件开发人员在软件开发中面临常见问题的解决方案,是经过长时间的试验积累总结出来的,它使设计更加灵活和优雅,复用性更好。从实用的角度来看,它代表了某一类问题的最佳实践。
设计模式是研究类和本身以及类和类之间如何协作的模式,是在软件开发中常见问题的解决方案模板。这些模板是经验丰富的开发者在解决各种问题时提出的最佳实践的总结。设计模式提供了一种通用的、可重复使用的方法,可以用于解决特定类型的问题,以改善软件的结构、可维护性和可扩展性。总之一句话:设计模式是针对于面向对象编程而设计的一套代码编程规范或者说是套路。
设计模式到底解决了开发过程中的哪些难题呢,它又是如何来解决的呢?
其核心是:复用和解耦。使不稳定依赖于稳定、具体依赖于抽象,以此增强软件设计适应变化的能力。
什么是编程范式
要探讨设计模式和编程语言的关系,还得从编程范式谈起。编程范式一词最早来自 Robert Floyd 在1979年图灵奖的颁奖演说,是程序员看待程序的观点,代表了程序设计者认为程序应该如何被构建和执行的看法,与软件建模方式和架构风格有紧密关系。
当前主流的编程范式有三种:
1. 结构化编程(structured programming)
2. 面向对象编程(object-oriented programming)
3. 函数式编程(functional programming)
这几种编程范式之间的关系如下:
1. 起初是非结构化编程,指令(goto指令)可以随便跳转,数据可以随便引用。后来有了结构化编程,人们把 goto 语句去掉了,约束了指令的方向性,过程之间是单向的,但数据却是可以全局访问的;
2. 后来面向对象编程的时候,人们干脆将数据与其紧密耦合的方法放在一个逻辑边界内,约束了数据的作用域,靠关系来查找;
3. 到函数式编程的时候,人们约束了数据的可变性,通过一系列函数的组合来描述数据,从源到目标映射规则的编排,中间它是无状态的;
编程范式是抽象的,编程语言是具体的。编程范式是编程语言背后的思想,要通过编程语言来体现。C 语言的主流编程范式是结构化编程,而 Java 语言的主流编程范式是面向对象编程,后来 Java8 开始支持 Lambda 表达式,将函数式编程范式的内容融合进来,同时新诞生的语言一开始就支持多范式,比如 Scala,Go 和 Rust 等。
从结构化编程到面向对象编程,再到函数式编程,抽象程度越来越高(离图灵机模型越来越远),与领域问题的距离越来越近。直观地来讲,就是解决现实问题的效率提升了,灵活性和执行效率随之有所下降。
设计模式无论用什么语言实现都是可以的,然而由于语言的各自差异化特点,不是每种语言都完美或统一实现各种设计模式。比如 Java 里面有策略模式,那是因为 Java8 之前不支持方法传递,不能把一个方法当作参数传给别人,所以有了策略模式。而 JavaScript 等语言可以直接传函数,就根本没必要造一个策略模式出来。
什么是多态特性
面向对象编程语言有三大特性:封装、继承和多态。
1. 封装即信息隐藏或数据保护,“数据结构”通过暴露有限的访问接口,授权外部仅能通过"数据结构"提供的方法(函数)来访问其内部的数据;
2. 继承的好处是可以实现代码复用,但不应过度使用,如果继承的层次过深就会导致代码可读性和可维护性变差。因此建议少用继承而多用组合模式;
3. 多态可以分为变量的多态,方法的多态,类的多态。通常强调的是类的多态,多态的实现是指子类可以替换父类,在实际代码运行过程中调用子类的方法实现;
多态可以说是面向对象中最重要的一个特性,是解决项目中紧偶合的问题,提高代码的可扩展性和可复用性的核心,是很多设计模式、设计原则、编程技巧的代码实现基础。
多态比较直观的理解就是去完成某个动作,当不同的对象去完成时会产生出不同的状态,其作用范围可以是方法的参数和方法的返回类型。
多态这种特性也需要编程语言提供特殊的语法机制来实现,Java 中多态可以通过"子类继承父类+子类重写父类方法+父类引用指向子类对象"的方式实现,还可以通过"接口语法"的方式实现。C++中则使用 virtual(虚函数)关键字来实现。像一些动态语言如 Python 也可以通过 duck-typing 的语法实现,另外 Go 语言中的"隐藏式接口"也算是 duck-typing。
Python 语言,实现多态示例如下
class MyFile:
def write(self):
print('I write a message into file.')
class MyDB:
def write(self):
print('I write data into db. ')
def doIt(writer):
writer.write()
def demo():
myFile= MyFile()
myDB = MyDB()
doIt(myFile)
doIt(myDB )
设计模式与架构模式
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。
了解架构模式
对给定上下文的软件架构中常见问题的一种通用的可复用的解决方案,可以为设计大型软件系统的各个方面提供相应的指导。它不仅显示了软件需求和软件结构之间的对应关系,而且指定了整个软件系统的组织和拓扑结构,提供了一些设计决策的基本原理,常见的架构设计模式如下:
架构模式 |
模式描述 |
适用场景 |
分层模式 (Layered pattern) |
用于可分解为子任务的结构化程序,每个子任务都位于特定的抽象层级,每一层都为上一层提供服务。 |
桌面应用程序; |
客户端-服务器模 |