大胖的部落格

Just a note

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  112 随笔 :: 0 文章 :: 3 评论 :: 0 Trackbacks
将抽象与实现分离,对实现部分的修改,不会影响抽象部分的代码。

也可以将抽象和实现理解成为两个不同维度。
例如:Software有Game和Ofiice两种,每种软件又需要在Win和Unix两种操作系统上有不同的实现,
那么可能的结构是Game和Office从Software派生;Game和Office又分别派生出WinGame,UnixGame和WinOffice,UnixOffice。
以后如果多出一个系统,每个Software的派生类又需要多出一个针对新操作系统的子类实现。

如果采用bridge模式,可按如下示例组织结构。
将针对系统的实现分离出来,Software只含有实现基类的指针。这样实现部分的扩展不会影响Software部分的代码。并且对Software部分而言,也隐藏了实现的细节。

#include <iostream>

using namespace std;

//实现部分的抽象基类
class Implement
{
public:
    
//由派生类完成不同的实现
    virtual void Operation() = 0;
}
;

//win实现
class WinImplement: public Implement
{
public:
    
void Operation() {cout<<"WinImplement"<<endl;}
}
;

//unix实现
class UnixImplement: public Implement
{
public:
    
void Operation() {cout<<"UnixImplement"<<endl;}
}
;

//抽象部分的抽象基类
class Software
{
public:
    
void SetImpl(Implement* p) {pi = p;}
    
virtual void Use() = 0
protected:
    
//实现部分
    Implement* pi;
}
;

//抽象部分的game派生
class Game: public Software
{
public:
    
void Use()
    
{
        cout
<<"Game: ";
        pi
->Operation();
    }

}
;

//抽象部分的office派生
class Office: public Software
{
public:
    
void Use()
    
{
        cout
<<"Office: ";
        pi
->Operation();
    }

}
;

int main()
{
    
//创建一个Win实现
    Implement* pi = new WinImplement;
    
//创建一个office实例
    Software* ps = new Office;
    
//将win实现赋给office
    ps->SetImpl(pi);
    
//调用实现
    ps->Use();
    delete ps;
    delete pi;

    
return 0;
}
posted on 2009-06-09 14:32 大胖 阅读(145) 评论(0)  编辑 收藏 引用 所属分类: Design Pattern

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理