桥接模式(Bridge)
将抽象部门与它的实现部分分离,使他们都可以独立变化。
在GoF23种设计模式中,属于结构型模式( Structural patterns)
。
桥接模式就像桥一样,只不过它连接的两端分别对应着两组或多组关联的且可独立拓展的对象。
比如:支付行为和支付渠道。支付行为可以有付款、收款、转账等。支付渠道可以有工行、建行、农行等。
再比如:系统平台与播放器。系统平台可以有Mac、Windows等。播放器有酷狗、网易云音乐等。
通过桥接模式就可以将这两组抽象的对象自由组合和拓展。
- 优点
- 抽象和具体实现之间更加灵活
- 系统拓展性更高
- 符合开闭原则
- 缺点
- 使用范围有局限性
- 会增加系统复杂性
- 使用场景
- 一个类存在两个或多个变化维度,且各维度都需要独立进行拓展
实例
角色说明
- Abstraction
- 类抽象接口
- RefinedAbstraction
- 抽象拓展类
- Implementor
- 实现类接口
- ConcreteImplementor
- 具体实现类
- Client
- 使用者
举例
- AbstractPlatform.java
public abstract class AbstractPlatform {
protected Player player;
public AbstractPlatform(Player player) {
this.player = player;
}
abstract void play(String songName);
}
- Mac.java
public class Mac extends AbstractPlatform {
public Mac(Player player) {
super(player);
}
@Override
void play(String songName) {
System.out.print("这是Mac平台...");
player.playMusic(songName);
}
}
- Windows.java
public class Windows extends AbstractPlatform {
public Windows(Player player) {
super(player);
}
@Override
void play(String songName) {
System.out.print("这是windows平台...");
player.playMusic(songName);
}
}
- Player.java
public interface Player {
void playMusic(String songName);
}
- KugouMusicPlayer.java
public class KugouMusicPlayer implements Player {
@Override
public void playMusic(String songName) {
System.out.println("使用酷狗播放 " + songName + " ~~~");
}
}
- NeteaseCloudMusicPlayer.java
public class NeteaseCloudMusicPlayer implements Player {
@Override
public void playMusic(String songName) {
System.out.println("使用网易云音乐播放 " + songName + " ~~~");
}
}
- Client.java
public class Client {
public static void main(String[] args) {
Windows windows = new Windows(new NeteaseCloudMusicPlayer());
windows.play("青花瓷");
}
}
- output
这是windows平台...使用网易云音乐播放 青花瓷 ~~~
实例
ssm三层架构,controller - service - dao
。
这里的service
层桥接了controller
层与dao
层。使得controller
层与dao
层可以独立拓展。
总结
桥接模式核心是分离抽象类与实现类。使其自由组合独立拓展,从而提高系统的延展性。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名,转载请标明出处
最后编辑时间为: