设计模式—桥梁模式

  啦啦啦,leo的第一篇博客,写的菜希望大家见谅哈。

  回忆过去 痛苦的相思忘不了。作为一只习惯在宿舍动漫美剧的伪程序猿,现在想起当时老师课上说诸如“多动脑想程序,更多动手编程”的话也是又醉又羞愧。如今放寒假了,也没番看了,剧也在等更。所以先来无事把这半年的有营养的部门总结一下成文字和code。一来自己复习,二来未来以后大家学习有一个参考。如果发现有不对的地方请指正,共同学习哈~

  

  这一部分主要讲一下设计模式吧。主要依据我的理解把学习过程中teacher传授的思想和例子梳理一下,最后用python实现一下,大家且看且学且指正~大笑大笑

 

  关于设计模式,有开发经验的软件攻城狮一定不陌生,每一个工程师手中肯定也是握着一两个熟练的模式以应对各种各样的需求。度娘中的解释如下:设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。正如上面所说,关于模式,就是一种套路,这一种套路能够让代码反复利用,让开发者多偷一点懒,办事效率进一步提高。里面的东西确实值得我们思考,那么闲话不多说了,开始设计模式之旅吧~

 

  第一个套路说一下桥梁模式。关于这个模式,给大家介绍一个例子。

  话说很久以前,岛上住着很多的鸟。对于编程者来说,他们要表示鸟的各种行为。作为面向对象设计的第一步,我们自然而然的思考出来是定义一个父类bird,至于是什么类型的bird呢?就用确定的bird去继承父类,从而可以实现鸟代码的复用。这样做的类图如下。

这里fly方法代指鸟所持有的各种行为,大家就认为飞行吧~这样是不是就万事大吉了呢?是不是一劳永逸了呢?其实不然,这个时候一只萌萌的企鹅来了。鸟们发现,这只鸟不能fly呀~?!这怎么办?

这个时候脑子转得快的人可能想到,我继承父类bird的时候分成bird that can fly 和 can not fly 的不就好了么?确实一定程度上这个可以作为一种解决方案,但是如果这只萌萌的企鹅说“我会游泳,别的鸟会么?”鹦鹉说“我会学话,别的会么?”孔雀说“我能开屏,别的会么?”鸵鸟......行了,那个想出方法的人已经醉了~

 

  关于的例子出现问题的关键点是,一开始大家认为大多数鸟会飞,也就是说在类中这一个方法他的子类应该会继承。但是,有的时候确实事与愿违,一味地使用继承不一定能收到良好的效果。再打一个比方,中国古代王位世袭,人们认为德才兼备的明君的后代也会德才兼备。而有些地方是选举,选出德才兼备的人。所以可能治理国家效果会好一点。

 

  行啦,直接说对策吧。继承不好使的话,我们使用一下组合吧,这就是传说中的桥梁模式。为了避免父类的不足之处暴露给子类,或者说使得程序更加灵活。我们采用组合的方式。所谓组合的方式就是把bird中fly方法单独做成一个父类,然后不同的fly去继承这个fly。使得程序更加的灵活。这样看来,老鹰的高空翱翔,蜂鸟的飞云掣电都能生动形象地表示出来。其实,从类图中我们看到,这样的方式趋于平稳,像一个桥梁一样,这有可能是称为桥模式的原因之一吧~

 

  关于继承和组合有一篇前辈博客有介绍,在此引用一下~

http://blog.csdn.net/zjliu1984/article/details/4299657

  最后一句高大上的话形容桥梁模式:将抽象和实现解耦,使得两者可以独立地变化。

  在这里给出python的一个版本的实现。也算是回馈一下在课上念叨了一个学期的老师~

class flyaction:
    def fly(self):
        print'fly'
    
class fast_flyaction(flyaction):
    def fly(self):
        print'fly fast'

class slow_flyaction(flyaction):
    def fly(self):
        print'fly slow'

class bird:
    def __init__(self):
        self.fly_action=None
    def let_fly(self,flyaction):
        self.fly_action=flyaction
    def show(self):
        pass
    
class Lark(bird):
    def show(self):
        if self.fly_action==None:
            print'can not fly'
        else:
            print 'Lark'
            self.fly_action.fly()

class Eagle(bird):
    def show(self):
        if self.fly_action==None:
            print'can not fly'
        else:
            print 'Eagle'
            self.fly_action.fly()

class Ostrich(bird):
    def show(self):
        if self.fly_action==None:
            print'ostrich '
            print'can not fly '
        else:
            print 'ostrich'
            self.fly_action.fly()
            
if __name__ == "__main__":
    slow=slow_flyaction()
    fast=fast_flyaction()

    
    lark =Lark()
    lark.let_fly(slow)
    lark.show()

    eagle=Eagle()
    eagle.let_fly(fast)
    eagle.show()
    
    ostrich=Ostrich()
    ostrich.show()


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值