13.桥接模式

1.说明
请参见第一章节
2.桥接模式说明
桥接模式:将抽象部分与它的实现部分分离,使他们都可以独立的变化
使用范围:在多个系类族中,每个族都在互相变化,一个族的变化,会影响到其它族的变化。那么这时候可以使用桥接模式,来实现
抽象与实现的分离:并不是说抽象类与其派生类分离,实现指的是抽象类和它的派生类用来实现自己的对象

关于对象继承:继承在编译阶段就定义好了,所以无法在运行时改变从父类继承的实现。子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然导致子类的变化。当你需要复用子类时,如果继承下来的实现不能够解决新的问题,则父类必须重写,或被其它更适合的替换。这种复用限制了灵活性。
聚合:弱拥有的关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分
合成:强拥有,体现了严格的部分与整体,部分和整体的生命周期一样

这里写图片描述

3.UML
//该UML说明在多个手机厂商和软件之间关系,该进行如何组合
这里写图片描述
这种方式当增加手机品牌时改动较大
这里写图片描述
这种方式当在增加手机软件时改动较大
这里写图片描述
由于实现方式有多种,桥接模式的核心意图就是把这些实现独立出来,让他们各自变化,这就使得每种实现的改变不会影响其他实现,达到应对变化的目的

4.代码

 //手机基类
 #ifndef __PHONE_H
#define __PHONE_H

#include <iostream>
#include <string>
#include <list>
#include "Soft.h"

typedef std::list<CSoft*> SOFTLIST;

class CPhone
{
public:
    CPhone(std::string name):m_name(name)
    {   
    }
    void add_soft(CSoft* phonesoft)
    {
        m_softlist.push_back(phonesoft);
    }
    void run_soft()
    {
        for (SOFTLIST::iterator it=m_softlist.begin(); it!=m_softlist.end(); it++)
        {
            (*it)->run();
        }
    }
protected:
    std::string m_name;
    SOFTLIST m_softlist;
};
#endif

//手机M实现
#ifndef __PHONEM_H
#define __PHONEM_H
#include <list>

#include "Phone.h"
#include "Soft.h"
class CPhoneM:public CPhone
{
public:
    CPhoneM(std::string name):CPhone(name)
    {       
    }
private:

};
#endif
//手机N的实现
#ifndef __PHONEN_H
#define __PHONEN_H

#include "Phone.h"

class CPhoneN:public CPhone
{
public:
    CPhoneN(std::string name):CPhone(name)
    {

    }
};

#endif

//软件基类
#ifndef __SOFT_H
#define __SOFT_H

#include <iostream>
#include <string>

class CSoft
{
public:
    CSoft(std::string name):m_name(name){}
    ~CSoft(){}
    virtual void run() = 0;
protected:
    std::string m_name;
};

#endif

//游戏类
#ifndef __GAME_H
#define __GAME_H

#include "Soft.h" 

class CGame:public CSoft
{
public:
    CGame(std::string name):CSoft(name)
    {

    }
    virtual void run()
    {
        std::cout<<"game run:"<<m_name.c_str()<<std::endl;
    }
};

#endif

//通讯录类
#ifndef __ADDRESS_H
#define __ADDRESS_H

#include "Soft.h"

class CAddRess:public CSoft
{
public:
    CAddRess(std::string name):CSoft(name)
    {

    }
    virtual void run()
    {
        std::cout<<"address run:"<<m_name.c_str()<<std::endl;
    }
};

#endif

//客户端调用类
#include <iostream>
#include "Soft.h"
#include "Game.h"
#include "AddRess.h"
#include "Phone.h"
#include "PhoneM.h"
#include "PhoneN.h"


int main(void)
{
    CSoft* game_n = new CGame("N game");
    CSoft* address_n = new CAddRess("N address");
    CSoft* game_m = new CGame("M game");
    CSoft* address_m = new CAddRess("M address");

    CPhone* phone_n = new CPhoneN("N phone");
    CPhone* phone_m = new CPhoneM("M Phone");

    phone_n->add_soft(game_n);
    phone_n->add_soft(address_n);
    phone_n->run_soft();

    std::cout<<std::endl<<std::endl;

    phone_m->add_soft(game_m);
    phone_m->add_soft(address_m);
    phone_m->run_soft();

    delete game_n;
    delete address_n;
    delete game_m;
    delete address_m;

    delete phone_n;
    delete phone_m;

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值