设计模式在储层算法类库的应用

时间:2022-08-28 04:27:27

设计模式在储层算法类库的应用

摘要:介绍一种基于设计模式的储层算法类库中类间通信的框架模型,该框架模型将单件模式,观察者模式应用到设计和开发之中,使整个类库的可复用性和可扩展性有了很大的提高。

关键词:算法类库;单件模式;观察者模式;设计模式

中图分类号:TP311文献标识码:A文章编号:1009-3044(2010)03-733-03

Application of Design Patterns in Algorithm Class Library

WANG Jia-hua, ZHAO Zhi-bao

(School of Computer, Xi'an Shiyou University, Xi'an 710065, China)

Abstract: This paper describes the communication framework model of class in algorithm class library based on design pattern. The framework model applies singleton pattern and observer pattern to the design and development of class library, greatly improves reusability and scalability of algorithm class library.

Key words: algorithm class library; singleton pattern; observer pattern; design patterns

在储层算法类库设计中,类与类之间、界面类与用户之间需要一种实时的通信方式。例如一个对象内部状态改变了,要及时通知监测它的对象进行响应;算法运行时,要向用户提供算法运行的进度,算法的运算的时间;算法界面对算法参数进行设置时,需要通知用户算法参数是否出错,为什么出错等等。本文主旨为通过面向对象常用的设计模式设计实现一种易于扩展、易于维护的类的通信模型,这对整个类库的可复用性和可扩展性都有显著的提高。

1 储层算法类库的模式设计

面向对象的编程中,软件编程人员更加注重以前的代码的重用性和可维护性。设计模式使人们可以更加简单方便地复用成功的设计和体系结构。将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。模式的好处在于:1)模式是以往一些专家解决问题所留下的经验经过整理可以协助生手快速进入设计程序的方式――这是经验的结晶;2)模式可以容易的重复使用设计及结构来开发新系统;3)模式协助你选择替代方案及改善维护工作。模式都是经过实证且成功运用在许多系统中;4)模式是前人的经验;学习模式可以避免我们再走过去失败的过程。

1.1 通信模型的模式设计

本通信模型主要采用单件模式、观察者模式。单件模式是创建型模式,主要是实例化一个类的对象,引入C++智能指针以后,可以通过智能指针引用计数管理对象内存空间的释放,有效避免C++语言内存泄露的问题。同时采用单件模式有以下好处:

1) 对唯一实例的受控访问,让类自身保存它的唯一实例。通常系统记录报错类运行时刻只有一个存在。

2) 可以保证客户端没有其他实例被创建,并提供一个访问该实例的方法。

3) 缩小名空间,对全局变量的一种改进。它避免了那些存储唯一实例的全局变量名污染名空间。

模型具体工作时采用观察者模式。观察者模式又叫做-订阅(Publish/Subscribe)模式。观察者模式定义了一种一对多地依赖模式,让多个观察者同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使它们能够自动更新自己。这里的主题对象就是指通知者,又叫做者。观察者又叫订阅者。一个软件系统常常要求在某一个对象发生变化的时候,某些其它的对象做出相应的改变,而观察者模式是解决这个问题的一个低耦合度的设计方案,它能够减少对象之间的耦合以便更加利于系统的复用。

观察者模式分两种情况:

1) 拉模式,是目标角色(subject)在发生变化后,仅仅告诉观察者角色状态发生变化了;观察者角色如果想要知道具体的变化细节,则就要自己从目标角色的接口中得到。这种模式被很形象的称为:拉模式――就是说变化的信息是观察者角色主动从目标角色中“拉”出来的。

2) 推模式,是目标角色(subject)的“服务一条龙”,通知发生变化的同时,通过一个参数将变化的细节传递到观察者角色中去。这就是“推模式”――就是目标角色主动将变化的信息推给观察者角色,不管观察者需要不需要。具体设计模型如图1所示。

1.2 核心类说明

1) 抽象主题Subject(Channel):用于将所有的对象引用保存在一个聚集中(比如Vector对象)里,每个Subject可以有任何数量的观察者。它又被叫做抽象观察者(Observable)角色,一般使用抽象类或接口实现。

2) 抽象观察者Observer(Scribe):为所有的具体观察者定义一个接口,在得到Subject的通知时更新自己,在本模型中表现为Write纯虚函数。

3) 具体主题ConcreteSubject (Log_channel等):将有关状态存入具体观察者对象。在具体主题的内部状态改变时,给所有登记过的观察者发出通知。又被称为具体被观察者角色。Error_channel是系统报错主题,Log_channel是系统日志记录主题,Out_channel是Win32控制台下输出主题。每一个观察者都可以订阅一个或多个主题。在扩展性方面,也可以根据实际需要定制特定情况的主题。

4) 具体观察者ConcreteObserver(Void_notifer):实现了抽象观察者Observer,在被观察者发出通知时,将自行执行Update方法更新。在本模型实现中,具体观察者可以订阅多种主题,并根据不同的主题的通知进行响应。

1.3 程序实现代码

class Scribe : public Named_interface // 采用智能指针,Named_interface为智能指针管理类

{ public:

virtual ~Scribe() {} // 析构函数

virtual bool subscribe(Channel& channel); // 订阅主题,将自己的引用指针存放在list中

virtual bool unsubscribe(Channel& channel); // 解除订阅,将自己的引用指针从list中删除

virtual void write(const std::string& str, const Channel* sender) = 0; //纯虚函数,子类实现

};

class Channel // 抽象主题类,定义主题共同拥有的属性和操作

{ public:

Channel(); // 主题类构造函数

virtual ~Channel(); // 主题类析构函数

virtual bool attach(Scribe* scribe); // 增加观察者,Scribe的subscribe调用attach进行订阅

virtual bool detach(Scribe* scribe); // 删除观察者,Scribe的unsubscribe调用attach进行解除

virtual void send();// 向订阅的观察者发送状态信息

protected:

std::ostringstream* buffer_; // 保存主题的状态信息

std::list< SmartPtr > scribes_ ; // 订阅的观察者列表,采用智能指针,引用计数

};

1.3.1 具体订阅的过程

bool Channel::attach( Scribe* scribe )

{

scribes_.push_back( scribe ); // 具体的观察者订阅主题时把自己的引用加入观察者列表中

return true;

}

bool Channel::detach( Scribe* scribe )

{

unsigned int size = scribes_.size();

scribes_.remove( SmartPtr( scribe ) ); // 具体的观察者解除订阅主题时把自己的

// 引用从观察者列表中删除

return scribes_.size() == size-1;

}

void Channel::send()

{

std::string message = buffer_->str();

if(message.empty()) return;

for( Channel::list_iterator it = scribes_.begin(); it != scribes_.end(); ++it)

{

(*it)->write( message, this ); // 观察者实现自己wirte,为多态。

}

clear();

}

1.3.2 单件模式的实现

Log_channel* Log_channel::instance_ = 0; // 定义类静态指针变量

Log_channel* Log_channel::instance() // 实例化指针变量,保证实例的唯一性

{

if(instance_ == 0)instance_ = new Out_channel;

return instance_;

}

2 结论与总结

通过设计模式中单件模式、观察者模式两者结合,一方面,可以很好的解决储层算法类库设计开发中算法实时报错、算法参数记录、算法处理进度显示等问题,同时在模型中加入智能指针、引用计数的技术管理对象的内存空间的释放,可以有效地避免内存泄露问题。另一方面,在解决实际问题时,也可以通过继承Channel主题抽象类,定制符合实际要求的主题类,扩展性强。

目前存在的问题,是模型中智能指针在循环引用方面没有解决,还需要进一步的研究。

参考文献:

[1] 揣锦华,李军民. C++程序设计语言[M]. 西安:西安电子科技大学出版社,2002.

[2] 蓝雯飞. C++面向对象程序设计中的多态性研究[J]. 计算机工程与应用,2002.

[3] (美)利普曼, 加・劳乔. C++ Primer中文版[M](第三版). 潘爱民, 张丽 译. 北京:中国电力出版社,2002.

[4] 张龙祥.UML与系统分析设计[M]. 北京:人民邮电出版社,2007.

[5] Steven John Metsker. 设计模式java手册[M]. 龚波,冯军, 程群梅 译.北京:机械工业出版社,2006.

[6] 周威.软件设计模式的研究及其在影碟出租系统中的应用[D]. 武汉:华中科技大学硕士学位论文,2007.

上一篇:WCF技术在生产经营预警系统中的应用研究 下一篇:决策树算法在专业方向指导中的应用