TinyMail研究—Stream及相关设计模式

TinyMail研究—Stream及相关设计模式

转载时请注明出处和作者联系方式:http://blog.csdn.net/absurd

作者联系方式:李先静<xianjimli at hotmail dot com>

更新时间:2007-4-12

TinyMail是一套针对移动设备设计的邮件系统框架,为了达到最大的灵活性,它采用了很多设计模式和先进的编程技术,让框架的每一部分都可以定制和配置。TinyMail流行的趋势非常明显,Nokia770/800GPE Phone Edition等项目中都使用了它。因为我们也要开发邮件系统,所以花了几天时间去研究它的实现,这里记录一些研究笔记,供有兴趣的朋友参考。本文介绍一下Stream及相关设计模式。

Stream是对输入/输出的抽象,为使用者提供一个统一的接口,使用者使用这个接口而不必关心它的实现,这是针对接口编程的典型例子。TinyMail实现了很多Stream,它们的关系如下:

<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 414.75pt; HEIGHT: 312.75pt" type="#_x0000_t75" o:ole=""><imagedata src="file:///C:/DOCUME~1/q/LOCALS~1/Temp/msoclip1/03/clip_image001.png" o:title=""></imagedata></shape>

CamelStream接口要求实现下列虚函数:

ssize_t (*read) (CamelStream *stream, char *buffer, size_t n);

ssize_t (*write) (CamelStream *stream, const char *buffer, size_t n);

int (*close) (CamelStream *stream);

int (*flush) (CamelStream *stream);

gboolean (*eos) (CamelStream *stream);

int (*reset) (CamelStream *stream);

CamelSeekableStream接口要求实现下列虚函数:

off_t (*seek) (CamelSeekableStream *stream, off_t offset, CamelStreamSeekPolicy policy);

off_t (*tell) (CamelSeekableStream *stream);

int (*set_bounds) (CamelSeekableStream *stream, off_t start, off_t end);

CamelTcpStream接口要求实现下列虚函数:

int (*connect) (CamelTcpStream *stream, struct addrinfo *host);

int (*getsockopt) (CamelTcpStream *stream, CamelSockOptData *data);

int (*setsockopt) (CamelTcpStream *stream, const CamelSockOptData *data);

struct sockaddr * (*get_local_address) (CamelTcpStream *stream, socklen_t *len);

struct sockaddr * (*get_remote_address) (CamelTcpStream *stream, socklen_t *len);

ssize_t (*read_nb) (CamelTcpStream *stream, char *buffer, size_t n);

这其中使用了不少设计模式,其中包括:

1. Adapter模式

Stream的整个设计都是基于Adapter模式的,TargetCamelSeekableStreamCamelStreamCamelTcpStream三个接口,AdapterCamelStreamMemCamelStreamFsCamelTcpStreamSSL之类的具体实现,而adaptee则是内存、文件和Socket之的Stream

2. Proxy模式

CamelStreamBuffer基于Proxy模式为其它Stream提供一种cache功能,让Stream可以预先读取和延迟写入,以提高Stream的性能。当然,这对于socket和文件之类stream的效果最为明显,而对于内存stream反而是多此一举。

3. Decorator模式

CamelStreamFilter基于Decorator模式为其它Stream提供一种转换功能,比如加密、编码转换或文件格式转换等等。

4. Strategy模式

CamelStreamFilter本身并不提供任何转换,真正的转换是filter决定的。安装不同的filter就可以完成不同的转换。CamelStreamFilterContext,而filter则是Strategy

5. Pipe-Filter模式

CamelStreamFilter支持多级filter,一个filter一个filter调用,这是典型的Pipe-Filter模式。

~~end~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值