(17)桥接模式
概念
桥接模式可以把两个独立变化的因素连接到一起。
举个射击游戏的例子
1:某射击游戏中有玩家,还有枪。而玩家能有好多人,比如张三/李四。枪也能有好多种类型,比如AK47/M4A1。
2:现在玩家和枪是独立的个体,我新增玩家不需要改变已有的玩家和枪的代码,我新增一把枪也不需要改变已有的玩家和枪的代码。
3:桥接模式可以把玩家和枪这两种互相独立的个体连接到一起。比如张三可以持有AK47或者持有M4A1,李四也能持有AK47或者M4A1。
4:同时我新增一把枪M16之后,使用桥接模式也能把张三和M16连接到一起
实现方式
/**
* 桥接
*/
public class Demo {
public static void main(String[] args) {
AK47 ak47 = new AK47();
M4A1 m4A1 = new M4A1();
GamePlayer zsAK47 = new ZhangSan(ak47);
GamePlayer zsM4A1 = new ZhangSan(m4A1);
GamePlayer lsAK47 = new LiSi(ak47);
zsAK47.leftKey();
zsM4A1.leftKey();
lsAK47.leftKey();
}
}
// 枪接口,所有枪都需要实现该接口
interface Gun {
void shoot(); // 开枪功能
}
// 具体枪 AK47
class AK47 implements Gun {
public void shoot() {
System.out.println("AK47 开枪");
}
}
// 具体枪 M4A1
class M4A1 implements Gun {
public void shoot() {
System.out.println("M4A1 开枪");
}
}
// 游戏玩家抽象类
abstract class GamePlayer {
protected Gun gun;
protected GamePlayer(Gun gun) {
this.gun = gun;
}
protected abstract void leftKey(); // 每个游戏玩家都能点击左键开枪
}
// 具体玩家ZhangSan
class ZhangSan extends GamePlayer {
protected ZhangSan(Gun gun) {
super(gun);
}
@Override
protected void leftKey() {
System.out.print("玩家 ZhangSan 点击左键:");
gun.shoot();
}
}
// 具体玩家LiSi
class LiSi extends GamePlayer {
protected LiSi(Gun gun) {
super(gun);
}
@Override
protected void leftKey() {
System.out.print("玩家 LiSi 点击左键:");
gun.shoot();
}
}
玩家 ZhangSan 点击左键:AK47 开枪
玩家 ZhangSan 点击左键:M4A1 开枪
玩家 LiSi 点击左键:AK47 开枪