Loading... # 设计模式(十九)——桥接模式 ## 参考 > 大话设计模式  ——  程杰 著 ## 目录 [设计模式(一)——简单工厂模式](https://www.princelei.club/archives/67.html) [设计模式(二)——策略模式](https://www.princelei.club/archives/68.html) [设计模式(三)——设计原则](https://www.princelei.club/archives/116.html) [设计模式(四)——装饰模式](https://www.princelei.club/archives/117.html) [设计模式(五)——代理模式](https://www.princelei.club/archives/119.html) [设计模式(六)——工厂方法模式](https://www.princelei.club/archives/132.html) [设计模式(七)——原型模式](https://www.princelei.club/archives/133.html) [设计模式(八)——模板方法模式](https://www.princelei.club/archives/134.html) [设计模式(九)——外观模式](https://www.princelei.club/archives/135.html) [设计模式(十)——建造者模式](https://www.princelei.club/archives/136.html) [设计模式(十一)——观察者模式](https://www.princelei.club/archives/137.html) [设计模式(十二)——抽象工厂模式](https://www.princelei.club/archives/138.html) [设计模式(十三)——状态模式](https://www.princelei.club/archives/139.html) [设计模式(十四)——适配器模式](https://www.princelei.club/archives/140.html) [设计模式(十五)——备忘录模式](https://www.princelei.club/archives/141.html) [设计模式(十六)——组合模式](https://www.princelei.club/archives/147.html) [设计模式(十七)——迭代器模式](https://www.princelei.club/archives/148.html) [设计模式(十八)——单例模式](https://www.princelei.club/archives/157.html) [设计模式(十九)——桥接模式](https://www.princelei.club/archives/159.html) [设计模式(二十)——命令模式](https://www.princelei.club/archives/160.html) [设计模式(二十一)——职责链模式](https://www.princelei.club/archives/161.html) [设计模式(二十二)——中介者模式](https://www.princelei.club/archives/162.html) [设计模式(二十三)——享元模式](https://www.princelei.club/archives/163.html) [设计模式(二十四)——解释器模式](https://www.princelei.club/archives/173.html) [设计模式(二十五)——访问者模式](https://www.princelei.club/archives/174.html) ## 何为桥接模式 - 桥接模式(Bridge),将抽象部分与它的实现部分分离,使它们都可以独立地变化。 什么叫抽象与它的实现分离,这并不是说,让抽象类与派生类分离,因为这没有任何意义。实现指的是抽象类和它的派生类用来实现自己的对象。桥接模式是对合成/聚合原则的应用。 ## 示例 为不同品牌(系统)的手机,实现游戏和通信录等软件。 ``` /** * 手机软件 */ public interface HandsetSoft { void run(); } ``` ``` /** * 手机游戏 */ public class HandsetGame implements HandsetSoft{ @Override public void run() { System.out.println("运行手机游戏"); } } ``` ``` /** * 手机通讯录 */ public class HandsetAddressList implements HandsetSoft{ @Override public void run() { System.out.println("运行手机通讯录"); } } ``` ``` /** * 手机品牌 */ public abstract class HandsetBrand { protected HandsetSoft soft; //设置手机软件 public void setSoft(HandsetSoft soft) { this.soft = soft; } //运行 public abstract void run(); } ``` ``` /** * 手机品牌N */ public class HandsetBrandN extends HandsetBrand{ @Override public void run() { soft.run(); } } ``` ``` /** * 手机品牌M */ public class HandsetBrandM extends HandsetBrand { @Override public void run() { soft.run(); } } ``` ``` /** * 客户端 */ public class MainClass { public static void main(String[] args) { HandsetBrand ab = new HandsetBrandN(); ab.setSoft(new HandsetGame()); ab.run(); ab.setSoft(new HandsetAddressList()); ab.run(); ab = new HandsetBrandM(); ab.setSoft(new HandsetGame()); ab.run(); ab.setSoft(new HandsetAddressList()); ab.run(); } } ``` 如果要增加一个功能,比如MP3音乐播放功能,那么只要增加这个类就行了。不会影响其他任何类。类的个数增加也只是一个。 ``` /** * 手机MP3播放 */ public class HandsetMP3 implements HandsetSoft { @Override public void run() { System.out.println("运行手机MP3播放"); } } ``` 如果要增加S品牌,只需要增加一个品牌子类就可以了。个数也是一个,不会影响其他类的改动。 ``` /** * 手机品牌S */ public class HandsetBrandS extends HandsetBrand { @Override public void run() { soft.run(); } } ``` 优先使用合成或聚合,而不是类继承。继承是一种强耦合的结构。父类变,子类就必须要变。所以我们在继承时,一定要在‘is-a’的关系时再考虑使用,而不是任何时候都去使用。 我觉得桥接模式所说的‘将抽象部分与它的实现部分分离’,还是不好理解,我的理解就是实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。 Last modification:June 11th, 2020 at 06:21 pm © 允许规范转载
不错不错,我喜欢看 https://www.237fa.com/
叼茂SEO.bfbikes.com