设计模式起源与常见设计原则

设计模式学习与复读,开坑开坑。

介绍

设计模式系列笔记基于蔡升达的《设计模式与游戏完美开发》一书,主要内容是书本部分知识的记录复读,以及个人的一些理解。

《设计模式与游戏完美开发》以一款游戏《P级阵地》的设计作为范例,通过游戏内各种需求作为引导进行设计模式的讲解。

我个人认为这种一个项目贯穿始终的书十分值得一看,再经过群内大佬的推荐,终于下定决心仔细研读,希望能够学习到各种设计模式的特点和在Unity项目中的应用。

设计模式起源与常见设计原则

GoF

1994年出版的《设计模式》一书的作者一共有4位,这4位作者被人称为“4人组”,即GoF(Gang of Four)。

《设计模式(Design Patterns)》翻开了面向对象程序设计的新篇章。

“每一种模式都在说明一个一再出现的问题,并描述解决方案的核心,让你能够据以变化,产生出各种格式,来解决上万个类似的问题”。

“模式”的概念

引入“模式”的概念,让软件设计能以经验积累的方式,将一些经常用来解决特定情况的“类设计”“对象组装”加以整理并定义成为一种“设计模式”。

说白了就是能偷懒

软件的设计模式

每一种设计模式满足以下几项要求:

  • 满足面向对象设计的原则
  • 解决一再出现的问题(总结)
  • 解决问题的方案和问题核心的关键点(击中痛点)
  • 可以重复使用的解决方案(可复用)

个人理解:设计模式是解决常见的、有共性的问题的“攻略”,根据这份“攻略”可以快速实现需求,并有一定的可靠性。

面向对象设计中常见的设计原则

《Agile Software Development:Principles,Patterns,and Practices》 中对常见的设计原则做了清晰说明,一共5个:

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

“一个类只负责一件事”

系统中功能的切分和归属是很令人困扰的,项目开发中经常会不断地向同一个类上添加功能,最后导致这个类十分庞大、接口过于复杂:类难以维护,不容易了解类的功能。整个项目会过度依赖于这个类。

实现“单一职责原则”,要不断地进行“类重构”,将类中与实现相关功能的部分抽取出来,另外封装成新的类,再利用组合的方式将新增的类加入到原类中,慢慢地就能实现此原则。

开——闭(OCP: Open——Closed Principle)

“对扩展开放、对修改关闭”

对于已经测试完成或已经上线运行的功能,应关闭对修改的需求,也就是不能再修改这个类的任何接口或实现内容。

但在需要增加需求时,不能置之不理,所以应该“对功能的增加保持开放”。这需要抽象化各个功能的“操作方法”,设计为接口,将“功能的实现”移到子类中。这之后添加功能,就是“增加子类”。

大概就是写个框架?

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

“子类必须能够替换父类”

通过继承,功能使用父类,不必在意是怎样的子类,只知道是继承了父类的子类即可。必须不能使用强制类型转换:“不能将对象强制转型为子类”。

依赖倒置原则(DIP: Dependence Inversion Priciple)

  • “高层模块不应该依赖于底层模块,两者都应该依赖于抽象概念”
  • “抽象接口不应该依赖于实现,而实现应该依赖于接口”

对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。

解决:上层调用下层,使得上层依赖于下层,当下层剧烈变动时上层也要跟着变动,这就会导致模块的复用性降低而大大提高了开发的成本。应由“高层模块定义接口”,到“底层模块遵循这个接口实现”。

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

“客户端不应该被迫使用它们用不到的接口方法”

当项目中出现了一个负责主要功能的类,而且这个类还必须负责跟其他子系统进行沟通时,针对每一个子系统的需求,主要类就必须增加对应的方式。这意味着增加了主类的接口复杂度。

应通过“功能的切分”和“接口的简化”来减少这类问题的发生,或者直接重新按照设计模式来规划类。

What’s More…

除上述5种常用原则之外,还有一些常用原则。

最小知识原则(LKP: Lest Knowledge Principle)

设计一个类的时候,越少使用到其他类提供的功能越好。也就是降低了耦合度,同时增加了重用性。

少用继承多用组合原则

对用类的组合,少用继承。

“时钟”类和“闹钟”类,在设计时当然可以使得“闹钟”继承“时钟”,但在系统中,可能只需要闹钟的功能,对当前时间并没有大的需求,这就可能导致“时钟”的功能影响到系统的使用。

解决这方面的问题,就是在“闹钟”类中声明一个“时钟”类的类成员,将继承改为类的组合,这样除了实现基本功能之外,还加强了语义,并易于维护。

与设计模式之间的关系

“设计模式”是在符合“面向对象设计原则”的前提下,解决软件设计问题的实践成果。

Daachun wechat
请给我钱ヾ(•ω•`)o