软件的架构与设计模式之模式的种类

  由于[GoF95]是论述软件模式的著作的第一本,也是OO设计理论著作中最流行的一本,因此有些人常常使用设计模式Design pattern)一词来指所有直接处理软件的架构、设计、程序实现的任何种的模式。另外一些人则强调要划分三种不同层次的模式:架构模式(ArchitECtural pattern)、设计模式(DESign Pattern)、成例(IDIom)。成例有时称为代码模式(Coding Pattern)。

这三者之间的区别在于三种不同的模式存在于它们各自的抽象层次和具体层次上。架构模式是一个系统的高层次策略,涉及到大尺度的组件以及整体性质和力学。架构模式的好坏可以影响到总体布局和框架性结构。设计模式是中等尺度的结构策略。这些中等尺度的结构实现了一些大尺度组件的行为和它们之间的关系。模式的好坏不会影响到系统的总体布局和总体框架。设计模式定义出子系统或组件的微观结构。代码模式(或成例)是特定的范例和与特定语言有关的编程技巧。代码模式的好坏会影响到一个中等尺度组件的内部、外部的结构或行为的底层细节,但不会影响到一个部件或子系统的中等尺度的结构,更不会影响到系统的总体布局和大尺度框架。

代码模式或成例(Coding Pattern 或 Idiom)

代码模式(或成例)是较低层次的模式,并与编程语言密切相关。代码模式描述怎样利用一个特定的编程语言的特点来实现一个组件的某些特定的方面或关系。

较为著名的代码模式的例子包括双检锁(Double-Check Locking)模式等。

设计模式(Design Pattern)

一个设计模式提供一种提炼子系统或软件系统中的组件的,或者它们之间的关系的纲要设计。设计模式描述普遍存在的在相互通讯的组件中重复出现的结构,这种结构解决在一定的背景中的具有一般性的设计问题。

设计模式常常划分成不同的种类,常见的种类有:

创建型设计模式,如工厂方法(Factory Method)模式、抽象工厂(AbSTract Factory)模式、原型(Prototype)模式、单例(Singleton)模式,建造(Builder)模式等

结构型设计模式,如合成(CompOSite)模式、装饰(Decorator)模式、代理(Proxy)模式、享元(Flyweight)模式、门面(Facade)模式、桥梁(Bridge)模式等

行为型模式,如模版方法(Template Method)模式、观察者(Observer)模式、迭代子(Iterator)模式、责任链(ChAIn of ResponsiBIlity)模式、备忘录(Memento)模式、命令(Command)模式、状态(State)模式、访问者(Visitor)模式等等。
以上是三种经典类型,实际上还有很多其他的类型,比如FundAMental型、Partition型,Relation型等等

设计模式在特定的编程语言中实现的时候,常常会用到代码模式。比如单例(Singleton)模式的实现常常涉及到双检锁(Double-Check Locking)模式等。

架构模式(Architectural Pattern)

一个架构模式描述软件系统里的基本的结构组织或纲要。架构模式提供一些事先定义好的子系统,指定它们的责任,并给出把它们组织在一起的法则和指南。有些作者把这种架构模式叫做系统模式[STELTING02]。

一个架构模式常常可以分解成很多个设计模式的联合使用。显然,MVC模式就是属于这一种模式。MVC模式常常包括调停者(MEDIator)模式、策略(Strategy)模式、合成(Composite)模式、观察者(Observer)模式等。

此外,常见的架构模式还有:

·Layers(分层)模式,有时也称Tiers模式

·BlackBOard(黑板)模式

·Broker(中介)模式

·Distributed Process(分散过程)模式

·Microkernel(微核)模式

架构模式常常划分成如下的几种:

一、 From Mud to Structure型。帮助架构师将系统合理划分,避免形成一个对象的海洋(A sea of objects)。包括Layers(分层)模式、Blackboard(黑板)模式、Pipes/Filters(管道/过滤器)模式等。

二、分散系统(Distributed Systems)型。为分散式系统提供完整的架构设计,包括像Broker(中介)模式等。

三、人机互动(Interactive Systems)型,支持包含有人机互动介面的系统的架构设计,例子包括MVC(Model-View-Controller)模式、PAC(Presentation-Abstraction-Control)模式等。

四、Adaptable Systems型,支持应用系统适应技术的变化、软件功能需求的变化。如Reflection(反射)模式、Microkernel(微核)模式等。

作业03 结构型模式 1. 现Mouse类的定义如下: class Mouse { public: void Walk( int steps ) { cout<<"Implement for Walk() with Verson 1."} void AddMoney(int m) { cout<<"Implement for AddMoney() with Verson 1."} private: int posX; int posY; }; 若已知:在后续的版本中 a)可能会增加Mouse类的其他行为,如增加Drive(int steps)和Fly(int steps); b)可能需要改变Walk(int steps)的具体实现细节; c)可能会增加其它数据成员,如将2D位置信息改为3D位置信息等。 d)希望在新版本中,尽可能地通过扩展老版本,适应新需求。 请使用桥接模式重新设计Mouse类及相关类,并简要说明如何适应变化a-d。 2. 请设计并实现一个foo.dll,其中含有类如下: a) 若foo.dll直接导出了类Foo、类FooA、类FooB,请使用类适配器和对象适配器,实现 class User { public: int myProcess( ) { /*适配Foo.process(); */ } }; b) 若foo.dll没有导出类Foo、类FooA、类FooB,但导出函数shared_ptr createFooA();和shared_ptr createFooB();,请使用对象适配器使得User可以适配任意指定的Foo类族的子类对象的process。 3. 针对给出的场景、描述,请说出最适当的模式名字,并用文字或示例代码给出简要的使用说明或解释。 1) 开发了一个用于数值计算的大型程序库,它的功能是强大的,但需要使用者具备较高的数学专业知识。为方便“菜鸟”级用户的使用,需要提供一个简化版的,但同时又不希望影响专业人员的使用。使用哪种设计模式较好?如何设计? 2) 在2D游戏的开发中,需要绘制地图,地图是由大量的“一样的图块”拼接而成,而“图块”的种类有限,目前有草地、海洋、沙漠、山地等,未来肯定要增加种类,但不会太多太频繁。采用何种模式组织“图块”类比较好?如何设计? 3) 在开发一个办公自动化系统时,项目组在ElectricSignature类集中实现了电子签名的功能。但在使用中发现该类不能完全满足用户需求,由于财力和人员的限制,决定直接购买第三方电子签名软件,其中的FZ_ESignet类功能与ElectricSignature的功能一样,但是两个类中的函数名都是不一样的,而且购买的只是二进制代码,没有源代码。现希望使用第三方软件的功能,但又不希望修改ElectricSignature的接口。使用哪种设计模式改进较好?如何改进? 4) 某书店需要开发一套图书购销存软件。在设计图书类时发现:图书有单行本和成套的,又细分成教辅材料、科学知识、文学著作等。设计时,希望能够以一致的方式访问各种图书,不论是单本的、成套的、IT类的或古典名著。使用哪种设计模式较好?如
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值