C++设计模式——4.bridge 桥模式

桥模式也是一个非常巧妙的关系,https://www.cnblogs.com/xiaobingqianrui/p/9013692.html这篇文章讲的比较好。

他把a*b的关系变成了a+b,有效的简化了类的数量,使用类的组合而不是继承来优化代码。

下面的代码中,我举了一个不同颜色画笔的例子来解释,还是非常好懂的

/*
    b.hpp
*/
#include<string>
#include<iostream>
class Color{
public:
    std::string color_name;
    Color(std::string cn):color_name(cn){}
    virtual ~Color(){}
    virtual void getColor()  //获得颜料,其实因为color_name初始化了,就可以直接返回
    {
        std::cout<<color_name;
    }
};
class Pen{
public:
    std::string pen_name;
    Pen(std::string pn):pen_name(pn){}
    virtual ~Pen(){}
    virtual void draw(Color* color)=0;      //开始下笔
};

/*
    main.cpp
    bridge 桥模式
    定义:
	    简化多个维度的变化
    考虑一个例子:
    我需要5种颜色的 粗,中,细 的画笔。
    如果单独继承,就需要 3*5个类,太冗余
    不过如果设计成Bridge模式,只需要3+5种类,用户便可以自己自由组合
*/
#include<iostream>
#include"b.hpp"
using namespace std;
/*
    我们先设计不同粗细的画笔
*/
class SlimPen : public Pen{ //细的笔
public:
    SlimPen():Pen("细笔"){}
    virtual void draw(Color* color){
        color->getColor();
        cout<<this->pen_name<<endl;
    }
};
class MiddlePen : public Pen{ //中的笔
public:
    MiddlePen():Pen("中笔"){}
    virtual void draw(Color* color){
        color->getColor();
        cout<<this->pen_name<<endl;
    }
};
class ThickPen : public Pen{ //粗的笔
public:
    ThickPen():Pen("粗笔"){}
    virtual void draw(Color* color){
        color->getColor();
        cout<<this->pen_name<<endl;
    }
};
/*然后设计不同的颜色*/
class Red:public Color{
public:
    Red():Color("红色的"){}
};
class Yellow:public Color{
public:
    Yellow():Color("黄色的"){}
};
class Blue:public Color{
public:
    Blue():Color("蓝色的"){}
};

int main(){
    //现在,我们就可以用3+5个类,创造出3*5个画笔了!
    Blue blue;Red red;Yellow yellow;
    SlimPen sp1;    //初始化细笔

    //愉快的蘸取不同颜色
    sp1.draw(&blue); 
    sp1.draw(&red); 
    sp1.draw(&yellow); 
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值