1、写在前面
今天先通读了一遍桥接模式的定义以及例子,但是不是很懂;里面许多名词以及语句的含义跟以前自己理解或者说通用的有些差别,还没来得及仔细琢磨;但是先写下来自己的能记住的两点:①紧耦合程序和松耦合程序,除了从类之间的关系上来说,还有一方面是从继承的角度来说,因为子类继承了父类,所以父类变,子类就必须变,这样其实也是一种紧耦合;②尽量使用合成/聚合,而少用继承;这个原则倒是让我重新审视了聚合/合成的含义,也明白了继承的缺点,更加想深入的理解一下桥接模式,感觉这个在实际的开发中会用到的更多,因为在目前所写的一个小模块中,已经发现有时候继承也不是很好,子类不能有比较独特的行为。
2、小原则
在使用面向对象思想来设计程序时,除了5大基础原则之外,还需要注意:合成/复合原则,即尽量使用合成/聚合,尽量少使用类继承。
因为对象的继承关系是在编译时就定义好了,所以无法在运行时改变从父类继承的实现;所以子类的实现与他的父类有非常紧密的依赖关系。而当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类就必须重写或被其他更适合的类替换。这种父子关系限制了灵活性并最终限制了复用性。
聚合体现的是一种弱的拥有关系,体现的是A对象可以包含B对象,但B不是A的一部分;合成则是一种强拥有关系,体现了严格的部分和整体关系,且部分和整体的生命周期一样。合成/聚合复用原则的好处是:优先使用对象的合成/聚合将有助于保持每个类被封装,并被集中在单个任务上,这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。
3、桥接模式定义与理解
桥接模式:将抽象部分与他的实现部分分离,使他们都可以独立变化。
理解:这里的抽象与实现分离并不是说抽象类与其派生类分离;应该这么理解:实现指的是抽象类和他的派生类用来实现自己的对象。由于“实现”的方式有多种,所以桥接模式的核心意图就是把这些实现独立出来,让他们各自变化。这样使得每种实现的变化不会影响其他实现,从而达到应对变化的目的。
换种方式来说:我们可能碰到“实现”系统有多种角度分类的情况,每一种分类都有可能变化,那么就可以把这些多角度分离出来,分别对每个角度进行抽象,并让他们独立变化,减少他们之间的耦合。
因此,当我们发现我们需要通过多种角度去分类实现对象,而只用继承会造成类的大量增加,不能满足开放—封闭原则时,就应该考虑使用桥接模式。
4、举例理解
以手机和手机软件为例来类比理解桥接模式
首先,手机可以按品牌进行分类,每一种品牌都搭载有不用类型的软件;同时,手机也可以按照软件进行分类,即品牌A搭载了软件a和b,品牌B搭载了软件c。这时候如果单从某一个角度(比如手机品牌)通过继承来实现设计时,就会出现如果增加一种软件,那么就需要改动手机品牌的基类,让其也增加新的软件种类。这就会造成随着扩展越来越多,继承的类规模会越来越庞大,而且每一次新增一种功能都会引起大量的增加,违反了开放—封闭的原则。
其次,在这个例子中“抽象与实现分离”的意思:将手机品牌和手机软件两个角度分别抽象出来,然后各自的派生类分别实现手机品牌和手机软件的抽象,最后在手机品牌内聚合 成为一个手机。此时,可以随时增加对象:比如新增一个手机软件,这时只需要在手机软件抽象的实现下面增加一个派生类即可;而手机品牌这个角度的抽象及其派生都不需要改变,还可以直接使用已经扩展的手机软件,就很好的避免了继承的情况下扩展造成大量类的增加。
5、结语
这是我在书上看了例子,然后抄下来例子之后的理解,可能说的还是有些不够清晰,欢迎各位随时指正!