设计模式学习笔记(八)——Bridge桥接

本文介绍桥接模式的应用场景和代码实现。桥接模式通过将抽象与其实现分离,让两者可以独立变化,适用于系统设计初期。文章通过示例代码详细解释了如何实现这种分离,并对比了它与对象适配器的不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

七、Bridge(桥接)

情景举例:

将抽象部分与它的实现部分分离,使它们都可以独立地变化。

代码示例:

/* 抽象部分的接口
*/
class Window {
public:
    Window(View* contents);
 
    // requests handled by window
    virtual void DrawContents();
/*
*/
    virtual void Open();
    virtual void Close();
    virtual void Iconify();
    virtual void Deiconify();
/*
*/
    // requests forwarded to implementation
    virtual void SetOrigin(const Point& at);
    virtual void SetExtent(const Point& extent);
    virtual void Raise();
    virtual void Lower();
/*
*/
    virtual void DrawLine(const Point&, const Point&);
    virtual void DrawRect(const Point&, const Point&);
    virtual void DrawPolygon(const Point[], int n);
    virtual void DrawText(const char*, const Point&);
/*
*/
protected:
    WindowImp* GetWindowImp();
    View* GetView();
/*
*/
private:
    WindowImp* _imp;
    View* _contents; // the window's contents
};
/* 实现部分的接口
*/
class WindowImp {
public:
    virtual void ImpTop() = 0;
    virtual void ImpBottom() = 0;
    virtual void ImpSetExtent(const Point&) = 0;
    virtual void ImpSetOrigin(const Point&) = 0;
/*
*/
    virtual void DeviceRect(Coord, Coord, Coord, Coord) = 0;
    virtual void DeviceText(const char*, Coord, Coord) = 0;
    virtual void DeviceBitmap(const char*, Coord, Coord) = 0;
    // lots more functions for drawing on windows...
protected:
    WindowImp();
};
/* 抽象部分可以独立的变化
*/
class IconWindow : public Window {
public:
    // ...
    virtual void DrawContents();
private:
    const char* _bitmapName;
};
/* 注意:抽象部分的实现实际上依赖了实现部分
*/
void IconWindow::DrawContents() {
    WindowImp* imp = GetWindowImp();
    if (imp != 0) {
        imp->DeviceBitmap(_bitmapName, 0.0, 0.0);
    }
}
/*
*/
void Window::DrawRect (const Point& p1, const Point& p2) {
    WindowImp* imp = GetWindowImp();
    imp->DeviceRect(p1.X(), p1.Y(), p2.X(), p2.Y());
}
/* 实现部分也可以独立的变化
*/
class XWindowImp : public WindowImp {
public:
    XWindowImp();
 
    virtual void DeviceRect(Coord, Coord, Coord, Coord);
    // remainder of public interface...
private:
    // lots of X window system-specific state, including:
    Display* _dpy;
    Drawable _winid;  // window id
    GC _gc;           // window graphic context
};
/*
*/
class PMWindowImp : public WindowImp {
public:
    PMWindowImp();
    virtual void DeviceRect(Coord, Coord, Coord, Coord);
 
    // remainder of public interface...
private:
    // lots of PM window system-specific state, including:
    HPS _hps;
};
 
/* 最关键的部分:抽象部分与实现部分的桥接处。
   这部分可以有各种变形,例子中使用了抽象工厂和单件。
也可以使用参数来指定实现部分。
*/
WindowImp* Window::GetWindowImp () {
    if (_imp == 0) {
        _imp = WindowSystemFactory::Instance()->MakeWindowImp();
    }
    return _imp;
}
/*
*/

个人理解:

桥接模式与对象适配器的结构非常相似,但他们主要的区别在于:对象适配器是使得2个无关的类能够协同工作,一般在系统的后期使用;而桥接则是在系统开始时就使用,目的是使得接口与实现部分独立并可以分别变化。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值