桥接模式,将抽象部分与它的实现部分分离,使它们都可以独立地变化。
应用场景:(1)解耦合抽象和实现
(2)抽象和实现需要分别自由扩展
缺点:增加了设计类的数量。
结构图:

这个模式的情景引入非常有意思,俺决定记一下笔记,嗯!
是关于手机品牌和手机软件关系的例子,有两个手机品牌:M和N,然后有通讯录和游戏两个软件。我一开始的思路也是类似于以下两种,按照品牌分类或者按照软件分类实现。


但是这种实现方式的缺点在于如果要开发一款新的软件,要针对每一个手机品牌增添一个具体实现类,同样,如果增加一个新的手机品牌,同样要把所有需要的软件重新进行具体开发,工作量巨大。然后这就体现了桥接模式的优越性。使用桥接模式的类图如下:

在这种模式下,手机品牌和手机软件可以独立变化,手机品牌和软件之间是聚合关系,像一个桥一样把品牌和软件连接起来,这样就可以独立地增加手机品牌或软件,每次只需要增加一个相应的类就可以了,不需要改动其他的类。而且符合开放-封闭原则,即对扩展是开放的,对修改是封闭的。(优秀啊优秀)
然后下面放一下代码叭!依旧是用java实现滴~
(1)HandsetBrand(手机品牌类):
package 桥接模式;
public abstract class HandsetBrand {
protected HandsetSoft soft;
//设置手机软件
public void setHandsetSoft(HandsetSoft soft) {
this.soft = soft;
}
//运行
public abstract void Run();
}
(2)HandBrandM、HandsetBrandN,两个具体的手机品牌:
package 桥接模式;
public class HandsetBrandM extends HandsetBrand{
@Override
public void Run() {
System.out.print("M品牌手机");
soft.Run();
}
}
package 桥接模式;
public class HandsetBrandN extends HandsetBrand{
@Override
public void Run() {
System.out.print("N品牌手机");
soft.Run();
}
}
(3)HandsetSoft(手机软件类):
package 桥接模式;
public abstract class HandsetSoft {
public abstract void Run();
}
(4)HandsetGame、HandsetAddressList,手机游戏和手机通讯录,两个具体的手机软件类。
package 桥接模式;
public class HandsetGame extends HandsetSoft{
@Override
public void Run() {
System.out.println("运行手机游戏");
}
}
package 桥接模式;
public class HandsetAddressList extends HandsetSoft{
@Override
public void Run() {
System.out.println("运行手机通讯录");
}
}
(5)客户端调用:
package 桥接模式;
public class Main {
public static void main(String[] args) {
HandsetBrand ab;
HandsetSoft game = new HandsetGame();
HandsetSoft list = new HandsetAddressList();
ab = new HandsetBrandM();
ab.setHandsetSoft(game);
ab.Run();
ab.setHandsetSoft(list);
ab.Run();
ab = new HandsetBrandN();
ab.setHandsetSoft(game);
ab.Run();
ab.setHandsetSoft(list);
ab.Run();
}
}
最后输出:
好啦!今天十点半就可以睡了哈哈哈哈哈好开心~