参考:https://www.cnblogs.com/zyrblog/p/9233189.htmlhtml
https://blog.csdn.net/yuxxz/article/details/92023480this
将抽象部分与它的实现部分分离,使他们均可以独立地变化。“将抽象部分与它的实现部分分离”指实现系统可能有多个角度分类,每一种分类均可能变化,那么就把这种多角度分离出来让它们独立变化,减小它们之间的耦合spa
举个例子:我给我喜欢的男孩子送礼物,从抽象的角度来讲,能够将礼物分为舒适类型的、狂野类型的;从具体的礼物来讲,好比送玫瑰,皮带,钱包(舒适的)、敌敌畏,杀猪刀(狂野的),.net
咱们能够利用继承来实现:
这样是能够实现,可是逼格过低,耦合度高,而且若是咱们须要再加一类礼物呢,扩展一直新类型的礼物,都会有多个子类须要实现code
1.Gift:定义抽象类的接口;维护一个指向GiftImpl类型对象的引用
2.WarmGift、ColdGift:扩充由Gift定义的接口
3.GiftImpl:定义实现类的接口,该接口不必定要与Gift的接口彻底一致;GiftImpl仅提供基本操做,Gift则着重定义基于这些基本操做的较高层次的操做
4.Flower:实现GiftImpl接口并定义它的具体实现htm
桥接模式要解决的问题:
将抽象部分与它的实现部分分离,使他们均可以独立地变化。“将抽象部分与它的实现部分分离”指实现系统可能有多个角度分类,每一种分类均可能变化,那么就把这种多角度分离出来让它们独立变化,减小它们之间的耦合对象
package com.mashibing.Bridge.v4; public abstract class Gift { GiftImpl impl; }
从礼物的类型来分类,舒适的,狂野的,漂亮的,丑陋的等等,从礼物的类型角度抽象出来,减小与具体的礼物的耦合blog
package com.mashibing.Bridge.v4; public class WarmGift extends Gift { public WarmGift(GiftImpl impl) { this.impl = impl; } }
package com.mashibing.Bridge.v4; public class WildGift extends Gift { public WildGift(GiftImpl impl) { this.impl = impl; } }
具体礼物的抽象类,这个能够是普通类,抽象类或者接口,根据实际须要,本类的目的是提供对具体礼物的基本操做,好比打印本身的名称等等继承
public class GiftImpl { }
package com.mashibing.Bridge.v4; public class Flower extends GiftImpl { }
package com.mashibing.Bridge.v4; public class Book extends GiftImpl { }
package com.mashibing.Bridge.v4; public class Main { public static void main(String[] args) { Gift g = new WarmGift(new Flower()); give(new Boy("李易峰"),g); } public static void give(Boy boy,Gift g) { System.out.println(g + " gived!"); } }