设计模式之语言选择
设计模式简介
背景
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。
设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。
设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。
项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。
设计原则
设计模式的目的是代码复用,增加可维护性.面向对象编程中为达到代码复用的目的需要遵循以下原则:
1. 单一职责原则 (Single Responsiblity Principle SRP)
2. 开闭原则(Open Closed Principle,OCP)
3. 里氏代换原则(Liskov Substitution Principle,LSP)
4. 依赖倒转原则(Dependency Inversion Principle,DIP)
5. 接口隔离原则(Interface Segregation Principle,ISP)
6. 合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP)、
7. 最小知识原则(Principle of Least Knowledge,PLK,也叫迪米特法则)
注: 开闭原则具有理想主义的色彩,它是面向对象设计的终极目标。其他几条,则可以看做是开闭原则的实现方法。
单一职责原则
又称单一功能原则,面向对象五个基本原则(SOLID)之一。它规定一个类应该只有一个发生变化的原因。该原则由罗伯特·C·马丁(Robert C. Martin)于《敏捷软件开发:原则、模式和实践》一书中给出的。马丁表示此原则是基于汤姆·狄马克(Tom DeMarco)和Meilir Page-Jones的著作中的内聚性原则发展出的。
所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。
开闭原则
原文是:“Software entities should be open for extension,but closed for modification”。
就是说模块应对扩展开放,而对修改关闭。模块应尽量在不修改原(是“原”,指原来的代码)代码的情况下进行扩展。
里氏替换原则
里氏代换原则是由Barbara Liskov提出的。如果调用的是父类的话,那么换成子类也完全可以运行。
依赖倒转原则
指在软件里面,把父类都替换成它的子类,程序的行为没有变化。简单的说,子类型能够替换掉它们的父类型。依赖性倒转其实可以说是面向对象设计的标志,用哪种语言编程并不是很重要。
接口隔离原则
每一个接口应该是一种角色,不多不少,不干不该干的事,该干的事都要干。
合成聚合复用原则
合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP)经常又叫做合成复用原则。合成/聚合复用原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的。它的设计原则是:要尽量使用合成/聚合,尽量不要使用继承。
就是说要少用继承,多用合成关系来实现。
最小知识原则
也叫迪米特法则。不要和陌生人说话,即一个对象应对其他对象有尽可能少的了解。
设计模式分类
设计模式分为三种类型,共23种。
创建型模式:
单例模式
抽象工厂模式
建造者模式
工厂模式
原型模式
结构型模式:
适配器模式
桥接模式
装饰模式
组合模式
外观模式
享元模式
代理模式
行为型模式:
模版方法模式
命令模式
迭代器模式
观察者模式
中介者模式
备忘录模式
解释器模式(Interpreter模式)
状态模式
策略模式
职责链模式(责任链模式)
访问者模式。
其他模式:
管道模式(pipeline)
MMVM 模式
MVC 模式
GO 语言简介
简介
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易
发展历史编辑
Go语言于2009年11月正式宣布推出,成为开放源代码项目,并在Linux及Mac OS X平台上进行了实现,后追加Windows系统下的实现。
谷歌资深软件工程师罗布·派克(Rob Pike)表示,“Go让我体验到了从未有过的开发效率。”派克表示,和今天的C++或C一样,Go是一种系统语言。他解释道,“使用它可以进行快速开发,同时它还是一个真正的编译语言,我们之所以现在将其开源,原因是我们认为它已经非常有用和强大。”
2007年,谷歌把Go作为一个20%项目开始研发,即让员工抽出本职工作之外时间的20%,投入在该项目上。除了派克外,该项目的成员还有其它一些谷歌工程师。
派克表示,编译后Go代码的运行速度与C语言非常接近,而且编译速度非常快,就像在使用一个交互式语言。
现有编程语言均未专门对多核处理器进行优化。派克表示,Go就是谷歌工程师为这类程序编写的一种语言。它不是针对编程初学者设计的,但学习使用它也不是非常困难。Go支持面向对象,而且具有真正的闭包(closures)和反射(reflection)等功能。
在学习曲线方面,派克认为Go与Java类似,对于Java开发者来说,应该能够轻松学会Go。
之所以将Go作为一个开源项目发布,目的是让开源社区有机会创建更好的工具来使用该语言,例如Eclipse IDE中的插件。目前还没有支持Go的IDE。
在目前谷歌公开发布的所有网络应用中,均没有使用Go。但是谷歌已经使用该语言开发了几个内部项目。
派克表示,Go是否会对谷歌即将推出的Chrome OS产生影响,现在还言之尚早,不过Go的确可以和Native Client配合使用。他表示,“Go可以让应用完美的运行在浏览器内。”例如,使用Go可以更高效的实现Wave,无论是在前端还是后台。
特点
Go语言是一种新的语言,一种并发的、带垃圾回收的、快速编译的语言。它具有以下特点:
1.它可以在一台计算机上用几秒钟的时间编译一个大型的Go程序。
2.Go语言为软件构造提供了一种模型,它使依赖分析更加容易,且避免了大部分C风格include文件与库的开头。
3.Go语言是静态类型的语言,它的类型系统没有层级。因此用户不需要在定义类型之间的关系上花费时间,这样感觉起来比典型的面向对象语言更轻量级。
4.Go语言完全是垃圾回收型的语言,并为并发执行与通信提供了基本的支持。
按照其设计,Go打算为多核机器上系统软件的构造提供一种方法。
Go语言是一种编译型语言,它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性。它也打算成为现代的,支持网络与多核计算的语言。要满足这些目标,需要解决一些语言上的问题:一个富有表达能力但轻量级的类型系统,并发与垃圾回收机制,严格的依赖规范等等。这些无法通过库或工具解决好,因此Go也就应运而生了。
特色
简洁,快速,安全,并行,有趣,开源,支持泛型编程,内存管理,数组安全,编译迅速
目标
Go的目标是希望提升现有编程语言对程序库等依赖性(dependency)的管理,这些软件元素会被应用程序反复调用。由于存在并行编程模式,因此这一语言也被设计用来解决多处理器的任务。
第一个 Go 程序
接下来我们来编写第一个 Go 程序 hello.go(Go 语言源文件的扩展是 .go),代码如下:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
执行以上代码输出:
$ go run hello.go
Hello, World!