【设计模式】桥

bridge模式据说是比较复杂的一个模式,从类图看其实一点都不复杂。我想复杂的部分应该就是怎么防止滥用吧。

其主要思想是将一些经常变的化实现部分与其表述分开。这样就表述和实现都可以独立变化了。

这里想起了鸵鸟是不是鸟的一个问题。也不知道举得合不合适。主要还是写一些代码吧。仅供参考就好。现在对这块还没有更深入的理解。

另外一个说bridge模式复杂的原因,我觉得主要是因为他应用的场景本身就复杂。比如抽象(表述)也要变化,实现也要变化,这比起很多其他模式,两者都变化已经够复杂了。但实际中似乎这种情况并不少。

/**
 * @file bridge.h
 * @author itegel
 * @date 2014/03/26 15:26:58
 * @brief 
 *  
 **/

#ifndef  __BRIDGE_H_
#define  __BRIDGE_H_

#include <iostream>
#include <string>

//飞行接口
class Flyable{
    public:
        Flyable(){}
        virtual void fly(){
            std::cout<<"nomal fly!"<<std::endl;
        }
        
};

//鸟....
class Bird{
    public:
        Bird(const char * name){
            name_ = name;
            fly_imp_ = NULL;
        }
        void set_fly_imp(Flyable * fly_imp){
            fly_imp_ = fly_imp;
        }
        void fly(){
            if (fly_imp_){
                fly_imp_->fly();
            } else {
                std::cout<<"can not fly!"<<std::endl;
            }
        }

        std::string get_name(){
            return name_;
        }
    protected:
        //飞行方式实现
        Flyable *fly_imp_;
    private:
        std::string  name_;
};

//老鹰算鸟
class Eagle : public Bird{
    public:
        Eagle() : Bird("eagle"){
        }
};

//鸵鸟算不算鸟呢,我觉得他是鸟,只是飞行跟别人不一样,而且一直在退化中,或许哪一天他的飞行方式变了,比如现在是跑步过程中扇几下翅膀,后面可能变成爬行了也不一定....
class Ostrich : public Bird{
    public:
        Ostrich():Bird("ostrich"){}
};

//翱翔
class EagleFly : public Flyable{
    public:
        virtual void fly(){
            std::cout<<"I am soaring ..."<<std::endl;
        }
};

//贴地飞行.....
class OstrichFly : public Flyable{
    public:
        virtual void fly(){
            std::cout<<"I am flying on my feet!"<<std::endl;
        }
};


#endif  //__BRIDGE_H_


 
/**
 * @file bridge.cpp
 * @author itegel
 * @date 2014/03/26 15:45:48
 * @brief 
 *  
 **/

#include "bridge.h"

int main(){
    OstrichFly ostrich_fly;
    EagleFly eagle_fly;

    Eagle eagle;
    std::cout<<eagle.get_name()<<"(no fly imp):"<<std::endl;
    eagle.fly();
    std::cout<<eagle.get_name()<<"(with fly imp):"<<std::endl;
    eagle.set_fly_imp(&eagle_fly);
    eagle.fly();

    Ostrich ostrich;
    ostrich.set_fly_imp(&ostrich_fly);
    std::cout<<std::endl<<ostrich.get_name()<<"(with fly imp):"<<std::endl;
    ostrich.fly();
    
    return 0;
}

输出:

eagle(no fly imp):
can not fly!
eagle(with fly imp):
I am soaring ...

ostrich(with fly imp):
I am flying on my feet!

例子比较简单,鸟可以有很多种,飞行是一种动作,每个鸟的飞行动作可能都不一样。

对于单个鸟,他的飞行方式可能也会变化。我想鸵鸟原来应该是鸟,他的祖先可能能飞,只是发现飞起来太累就进化成跑了。

哪天他或许还能飞了也不一定(逃离雾霾区,跑明显不靠谱)。人平时不能飞,但是鸟人就可以飞。哪天兄台变成鸟人了,其实就需要有一个flyable的接口。但是不一定要继承自鸟...除非真的是鸟变的人....

bridge主要思想还是用组合代替继承。很灵活的一个模式。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值