桥接模式:
将“抽象化”与“实现化”进行“脱耦”。使得两者可以独立地演化
抽象化:存在于多个实体中的共同概念性联系,就是抽象化。比如一组独享如果具有相同的概念性联系,那么它就可以通过一个共同的类来描述,如果一组类具有相同的概念性联系,就可以通过一个抽象类来描述。
实现化:抽象化给出具体实现,就是实现化,比如一个类的实例化就是这个类的实现化,一个具体子类就是抽象超类的实现化。
脱耦:就是两个实体的行为的某种强关系,将强关系去掉就是脱耦。在此处,脱耦是指的将抽象化和实现化的耦合解开或者将他们的强关联换成弱关联。桥接模式中的所谓的脱耦就是对系统中抽象化和实现化之间的关系使用聚合关系而不是继承关系。
强关联VS弱关联:在编译时期已经确定,无法再运行时期动态改变的关联;弱关联就是在运行时期可以动态确定并改变的关联。
继承关系是强关联,聚合关系是弱关联。
这个系统由抽象化角色和修正化角色组成的抽象化等级结构。由实现化角色和具体实现化角色组成的实现化等级结构。抽象化角色:抽象化给出定义,并保存一个实现化对象的引用。修正抽象化角色:扩展抽象化角色,改变父类对抽象化的定义。实现化角色:这个角色给出实现化接口,但是不给出具体的实现,必须指出的是,这个接口可以与抽象化角色的接口非常不一样,实现化操作应该给出底层的操作,而抽象化角色应当给出基于底层操作的更改一层的操作。具体实现化角色:给出实现化角色接口的具体实现。
代码实现:
#抽象类:人 class Human(): skill = None def set_skill(self, skill): self.skill = skill def perform_skill(self): pass #具体抽象类:码农 class Cs(Human): def perform_skill(self): #重写基类中的技能 print('我是码农,给我力量吧!') self.skill.perform_skill() #具体抽象类:老师 class Teacher(Human): def perform_skill(self): #重写基类中的技能 print('我是教师,给我力量吧!') self.skill.perform_skill() #功能类:技能 class Skill(): def perform_skill(self): pass #具体功能类:编程 class S_code(Skill): def perform_skill(self): print('我拥有编程技能!') #具体功能类:上课 class S_teach(Skill): def perform_skill(self): print('我拥有教书技能!') #工作函数 def main(): s1=S_code() #编程技能 s2=S_teach() #教书技能 h1 = Cs() #程序员 h1.set_skill(s1) #赋予程序员编程技能 h1.perform_skill() #演示这个技能 h1.set_skill(s2) #赋予程序员教书技能 h1.perform_skill() #演示教书技能 h2 = Teacher() #教师 h2.set_skill(s1) #赋予教师编程能力 h2.perform_skill() #演示这个技能 h2.set_skill(s2) #赋予教师教书技能 h2.perform_skill() #演示教书技能 return True #测试 if __name__ == '__main__': main()
运行结果:
我是码农,给我力量吧! 我拥有编程技能! 我是码农,给我力量吧! 我拥有教书技能! 我是教师,给我力量吧! 我拥有编程技能! 我是教师,给我力量吧! 我拥有教书技能!轻松实现了抽象化和功能的脱耦!