设计模式之十八:桥接模式(Bridge)

桥接模式:

将抽象部分和它的实现部分相分离开来,以使它们可以单独地变化。

UML图:

主要包括:

  1. Abstraction:定义了抽象部分的接口,操作一个实现部分对象的引用。
  2. RefinedAbstraction:继承自抽象部分的类。
  3. Implementor:实现部分的接口。
  4. ConcreteImplementor:实现了Implementor定义的接口的具体类。

C++代码如下:

#include <iostream>

using namespace std;

class Implementor
{
    public:
    virtual void operationImpl()=0;
};

class ConcreteImplementorA:public Implementor
{
    public:
    void operationImpl()
    {
        cout<<"ConcreteImplementorA::operationImpl"<<endl;
    }

};

class ConcreteImplementorB:public Implementor
{
    public:
    void operationImpl()
    {
        cout<<"ConcreteImplementorB::operationImpl"<<endl;
    }

};

class Abstraction
{
    public:
        virtual void operation()=0;
        void setImplementor(Implementor * i)
        {
            impl=i;
        }
        Implementor * getImplementor()
        {
                return impl;
        }
    protected:
        Implementor * impl;
};

class RefinedAbstraction:public Abstraction
{
    public:
        void operation()
        {
            impl->operationImpl();
        }
};

int main()
{
    cout<<"桥接模式例子"<<endl;
    Abstraction * ab=new RefinedAbstraction();
    Implementor * cia=new ConcreteImplementorA();
    ab->setImplementor(cia);
    ab->operation();
    Implementor * cib=new ConcreteImplementorB();
    ab->setImplementor(cib);
    ab->operation();
    delete cia;
    delete cib;
    delete ab;
    return 0;
}

执行输出:



下面是一个具体的例子,看这个具体的例子可能好理解一些,摘自大话设计模式:

  1. Abstraction为Phone(手机)。
  2. RefinedAbstraction为Samsung(三星手机),Huawei(华为手机)。
  3. Implementor为Game(手机游戏)。
  4. ConcreteImplementor为NeedForSpeed(极品飞车),QQGame(QQ游戏),FruitNinjia(水果忍者)。

UML类图为:

C++代码:

#include <iostream>

using namespace std;

class Game
{
    public:
    virtual void play()=0;
};

class NeedForSpeed :public Game
{
    public:
    virtual void play()
    {
        cout<<"need for speed play"<<endl;
    }
};

class QQGame :public Game
{
    public:
    virtual void play()
    {
        cout<<"QQGame play"<<endl;
    }
};

class FruitNinjia:public Game
{
    public:
    virtual void play()
    {
        cout<<"Fruit Ninjia play"<<endl;
    }
};

class Phone
{
    public:
    virtual void run()=0;
    void setGame(Game *g)
    {
        game=g;
    }
    Game * getGame()
    {
        return game;
    }
    protected:
    Game *game;
};

class Samsung:public Phone
{
    public:
    virtual void run()
    {
        cout<<"Samsung :";
        game->play();
    }
};

class HuaWei:public Phone
{
    public:
    virtual void run()
    {
        cout<<"HuaWei :";
        game->play();
    }

};

int main()
{
    cout<<"桥接模式真实的例子,不同的手机品牌和手机游戏"<<endl;
    Phone *samsung=new Samsung();
    Phone *huawei=new HuaWei();
    Game * needForSpeed=new NeedForSpeed();
    Game * qqGame=new QQGame();
    Game * fruit=new FruitNinjia();
    samsung->setGame(qqGame);
    samsung->run();
    huawei->setGame(needForSpeed);
    huawei->run();
    samsung->setGame(fruit);
    samsung->run();
    delete samsung;
    delete huawei;
    delete needForSpeed;
    delete qqGame;
    delete fruit;
    return 0;

}

执行输出:

时间: 2024-10-21 17:02:18

设计模式之十八:桥接模式(Bridge)的相关文章

跟着实例学习设计模式(9)-桥接模式bridge(结构型)

桥接模式属于结构型设计模式. 设计意图:将抽象部分与实现部分分离,使它们都可以独立的变化. 一看到设计意图,大家可能有些发懵,我们看到的继承和接口不都是抽象和实现分离的吗?尤其是接口和抽象类都是这样的实现啊!那怎么还有这么个桥接的分离呢? 我们先来看个例子. 例如:汽车品牌内置导航仪,我们希望实现,每个品牌的导航仪都可以在任何一个牌子的汽车上安装并启动. 汽车品牌有两个:宝马.奔驰. 导航仪有三个牌子:神行者.北斗.高德. 来看正常的设计,我们肯定是会这样的采用继承来实现每个组合的安装和启动处理

二十四种设计模式:桥接模式(Bridge Pattern)

桥接模式(Bridge Pattern) 介绍将抽象部分与它的实现部分分离,使它们都可以独立地变化. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,现在使这些操作的抽象部分和实现部分分离. MessageModel using System; using System.Collections.Generic; using System.Text; namespace Pattern.Bridge { /// <summary> /// Message实体类 //

如何让孩子爱上设计模式 ——10.桥接模式(Bridge Pattern)

如何让孩子爱上设计模式 --10.桥接模式(Bridge Pattern) 我有故事,你有酒吗?这年头写个技术文不讲个故事都不行,行,我讲: 还有发现很多的技术博文都开始有喜欢往文中插入几个表情的趋势了, 但是你真的插的姿势对了吗?这种事情不是随便插的,来来来,给你 见识下如何在适当的场景插入适当的表情以让读者感觉到易可赛艇, 本文以讲故事插表情为主,讲述桥接模式为辅,多图预警, 简书上排版可能有些问题,最佳排版可见: https://www.zybuluo.com/coder-pig/note

【设计模式】桥接模式 Bridge Pattern

开篇还是引用吕振宇老师的那篇经典的文章<设计模式随笔-蜡笔与毛笔的故事>.这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了. 现在市面上卖的蜡笔很多,各种型号,各种颜色种类繁多, 假如一盒蜡笔有24种颜色,那么它能涂抹出24种不同的颜色来,蜡笔型号是固定的,如果想画出各种线条那么就要购买不同型号的蜡笔,假如我们要涂抹出粗,中,细三种线条,那么我们就要买3盒粗,中,细型号的蜡笔才能满足需求,那么就是3盒*24色=72只蜡笔.假如使用毛笔来作画,我们需要准备3只粗,中,

设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕该功能.如查找.排序等,一种经常使用的方法是硬编码(Hard Coding)在一个类中,如须要提供多种查找算法,能够将这些算法写到一个类中,在该类中提供多个方法,每个方法相应一个详细的查找算法:当然也能够将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件推断语句来进行选择.

设计模式入门之桥接模式Bridge

//桥接模式定义:将抽象部分与它的实现部分分离,使得他们都可以独立地变化 //广义来讲,桥接模式非常普遍,面向抽象编程,面向接口编程就可以看作是他的体现 //实例:一个系统,要按照不同的要求发信息(普通,加急,特急),而且还要以不同的方式发送(站内信,Email,短信)等,考虑到其扩展性,用桥接模式再合适不过了 //上代码 //桥接的一半---抽象部分 public abstract class AbstractionMessage { protected MessageImplementor

【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查找.排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法:当然也可以将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件判断语句来进行选择.这

C#设计模式之十二代理模式(Proxy Pattern)【结构型】

原文:C#设计模式之十二代理模式(Proxy Pattern)[结构型] 一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是"结构型"设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来看看."代理"可以理解为"代替",代替"主人"做一些事情,为什么需要"代理",是因为某些原因(比如:安全方面的原因),不想让"主人"直接

【设计模式最终总结】桥接模式

桥接模式概述 桥接模式是一种很实用的结构型设计模式,如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合“单一职责原则”.与多层继承方案不同,它将两个独立变化的维度设计为两个独立的继承等级结构,并且在抽象层建立一个抽象关联,该关联关系类似一条连接两个独立继承结构的桥,故名桥接模式. 桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联取代了传统的多层继承,将类之间的静态继承关系转换为动态的对象组合关系,使得系统更加灵活,并易于扩

Java设计模式(十) 备忘录模式 状态模式

(十九)备忘录模式 备忘录模式目的是保存一个对象的某个状态,在适当的时候恢复这个对象. class Memento{ private String value; public Memento(String value){ this.value = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } class Storage