zoukankan      html  css  js  c++  java
  • 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,它们的关系如下:

     

     

    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~~

     
  • 相关阅读:
    树套树
    Luogu P2839 [国家集训队]middle
    苟随笔
    BJOI2014 大融合
    轻量树上问题选做
    sb的斜率优化笔记
    CDialogEx::OnPaint()的问题,或者为什么在对话框程序的OnPaint中绘图无效的问题
    VC6的工程转到VC2010或更高版本出现fatal error C1189编译错误的解决方法
    C语言实现的反转字符串
    在终端输入npm run serve时出现npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! test_vue_0613@1.0.0 dev: 错误的解决方法
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6167736.html
Copyright © 2011-2022 走看看