Unity设计模式概论---上

82 阅读6分钟

概论

设计模式主要应用于面向对象软件设计领域,对于面向对象编程有很好的指导意义。虽然很多java和C#程序员一直在从事软件开发,但是基本上还是按照传统的结构化编程方式,不理解抽象类和接口有什么作用,不明白什么时候该用类继承,什么时候该用对象关联,通过对设计模式的学习,才会真正领悟面向对象的魅力,更好地从事面向对象设计与编码工作。

设计模式是从众多优秀的软件系统中总结出的成功的、目的是为了更好地实现可维护性复用的设计方案。设计模式是在特定环境下为解决某一通用软件设计问题提供的一套定制的解决方案,该方案描述了对象和类之间的相互作用,它是一套被反复使用的、多数人知晓的、经过分类目的、代码设计经验的总结。随着软件寿命的延长和软件规模的扩大,如何更好地维护软件和实现软件的复用是现在软件界面临的一个很重要的问题,软件维护花费了企业的时间、精力和金钱,从某种意义上说,设计模式的使用避免了一些重复性的设计工作,有助于提高设计和开发效率。

设计模式提供了一套标准的设计词汇,方便开发人员之间交流,如适配器、桥接模式的应用场景,单例类的实现,迭代器的功能。此外,设计模式对于提高系统的可重用性、可扩展性以及设计方案的文档化都具有重要的意义。

学习设计模式可以更好地了解面向对象的三大特性:封装、继承、多态,同时还能帮助阅读和理解类库和框架的源码,降低学习成本。

软件模式是将模式的一般概念应用于软件开发领域,即软件开发的总体指导思路和参照样板。软件模式并非仅限于设计模式、还包括架构模式、分析模式和过程模式等,实际上,在软件生存期的每一个阶段都存在着一些被认同的模式。

软件模式可以认为是对软件开发这一特定"问题"的"解法"的某种统一表示,即软件模式等于一定条件下出现的问题以及解法。软件模式的基础结构尤四个部分构成:问题描述、前提条件(环境或约束条件)、解法和效果。

软件模式图

image.png

解决方案从候选模式升格为模式

软件模式与具体的应用领域无关,在模式发现过程中需要遵循大三律,即只有经过三个以上不同类型系统的校验,一个解决方案才能从候选模式升格为模式。

设计模式简介

每一个模式都描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。 人是一个经验性的动物。设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案。软件设计模式是团建领域设计经验的归纳与汇集。

设计模式概念

设计模式是经过验证的,在特定环境下重复出现的,针对特定问题的程序解决方案。

设计模式的基本要素

设计模式一般有如下基本要素:模式名称、问题、目的、解决方案、效果、实例代码和相关设计模式。

其中的关键元素包括以下几个方面:

模式名称、问题、解决方案、效果。

设计模式分类

image.png

结构型模式:

适配器模式(Adapter)

桥接模式(Bridge)

组合模式(Composite)

装饰模式(Decorator)

外观模式(Facade)

享元模式(Flyweight)

代理模式(Proxy)

行为型模式

职责链模式(Chain of Responsibility)

命令模式(Command)

解释器模式(Interpreter)

迭代器模式(Iterator)

中介者模式(Mediator)

备忘录模式(Memento)

观察者模式(Observer)

状态模式(State)

策略模式(Strategy)

模板方法模式(Template Method)

访问者模式(Visitor)

游戏中常用开发模式

单例模式

工厂模式

观察者模式

代理模式

命令模式

适配器模式

合成模式

访问者模式

著作《设计模式,可复用面向对象软件的基础》

面向对象与设计模式

面向对象设计模式解决的是"类与相互通信的对象之间的组织关系,包括角色、职责、协作方面。",面向对象设计模式是"好的面向对象设计",可以满足"应对变化,提高复用"的设计。

面向对象设计模式不像算法技巧,可以照搬照用,它是建立在对"面向对象"纯熟、深入理解的基础上的经验性认识,掌握面向对象设计模式的前提是首先掌握"面向对象";

恰当地使用设计模式

"什么时候、什么地方应用设计模式"比"理解设计模式结构本身"更为重要,设计模式的应用不应先入为主,一上来就使用设计模式是对设计模式的最大误用,没有一步到位的设计模式。

现代软件设计的特征是"需求的频繁变化",如果没有需求变化,就没有面向对象,更没有"面向对象设计模式"。设计模式的要点便是:寻求变化点,然后在变化点处应用设计模式,从而更好地应对需求的变化。

敏捷软件开发实践提倡的"重构与模式"是目前普遍公认的最好的使用设计模式的方法。

设计模式中的扩展点

为了合理地利用设计模式,我们应该明白扩展点这个概念,扩展点并非天生就有,而是设计出来的。在设计软件架构时,要同时设计哪些地方可以改,哪些地方不能改。倘若设计不能满足显示世界的需要,我们就要重构,把有用的扩展点加进去,把没有的扩展点去除掉,这与用不用设计模式没关系,这跟对具体行业的理解有关系。

设计模式归根结底是因为使用的程序语言抽象能力不足而发明的。例如监听者Listener模式,在C#里面就是一个event关键字,不需要写一大堆框架来增加这个扩展点。

学会设计模式的秘诀是拆创造条件去使用设计模式,只有通过复杂的程序来学习设计模式,必须复杂,复杂到不用设计模式就做不下去,这样才能起到学习设计模式的作用。

学习---应用---总结---学习。