正文
一、为什么要使用桥接模式
1.1 定义
桥接模式(bridge):抽象与实现分离,二者可以独立变化,用组合关系代替继承关系,降低了耦合度
1.2 优点
降低耦合度,扩展性强,细节对客户透明
1.3 缺点
设计难度大,对系统要有深入的理解
1.4 使用场景
一个类有两个独立变化的维度
1.5 链路类图
二、桥接模式代码实现(常规写法)
2.1 定义 位置路线接口 RoadAPI
/** * @Author liuy * @Description 英雄联盟位置路线接口 * @Date 2022/7/11 18:48 * @Version 1.0 */ public interface RoadAPI { //玩家选择的位置 void location(); }
2.2 实现RoadAPI
上路实现类:UpRoadService
/** * @Author liuy * @Description 上路实现类 * @Date 2022/7/11 17:51 * @Version 1.0 */ public class UpRoadService implements RoadAPI { @Override public void location() { System.out.println("走上路!"); } }
中路实现类 MiddleRoadService
/** * @Author liuy * @Description 中路实现类 * @Date 2022/7/11 17:55 * @Version 1.0 */ public class MiddleRoadService implements RoadAPI { @Override public void location() { System.out.println("走中路!"); } }
下路实现类 UpRoadService
/** * @Author liuy * @Description 下路实现类 * @Date 2022/7/11 17:54 * @Version 1.0 */ public class DownRoadService implements RoadAPI { @Override public void location() { System.out.println("走下路!"); } }
2.3 创建英雄与路线桥接抽象类 >Hero
/** * @Author liuy * @Description 英雄与路线桥接抽象类 * @Date 2022/7/11 17:59 * @Version 1.0 */ public abstract class Hero { protected RoadAPI roadAPI; //注入所选路线 => 桥接过程 public void initRoad(RoadAPI roadAPI) { this.roadAPI = roadAPI; } //选择英雄启动游戏抽象方法 public abstract void game(); }
2.4 创建各个英雄类型继承Hero
EZ 伊泽瑞尔类
/** * @Author liuy * @Description 使用EZ开始游戏 * @Date 2022/7/11 18:09 * @Version 1.0 */ public class Ez extends Hero{ //注入所选路线 => 桥接过程 @Override public void initRoad(RoadAPI roadAPI) { this.roadAPI = roadAPI; } //重写父类选择英雄启动游戏抽象方法 @Override public void game() { System.out.println("我要玩EZ"); //路线选择 roadAPI.location(); } }
YaSuo 亚索类
/** * @Author liuy * @Description 使用亚索开始游戏 * @Date 2022/7/11 18:13 * @Version 1.0 */ public class YaSuo extends Hero{ //注入所选路线 => 桥接过程 @Override public void initRoad(RoadAPI roadAPI) { this.roadAPI = roadAPI; } @Override public void game() { System.out.println("我要玩亚索"); //路线选择 roadAPI.location(); } }
MangSeng 盲僧类
/** * @Author liuy * @Description 使用盲僧开始游戏 * @Date 2022/7/11 18:14 * @Version 1.0 */ public class MangSeng extends Hero{ //注入所选路线 => 桥接过程 @Override public void initRoad(RoadAPI roadAPI) { this.roadAPI = roadAPI; } @Override public void game() { System.out.println("我要玩盲僧"); //路线选择 roadAPI.location(); } }
2.5 编写测试类 测试桥接模式
/** * @Author liuy * @Description 测试英雄联盟桥接模式 * @Date 2022/7/11 18:25 * @Version 1.0 */ public class Demo { public static void main(String[] args) { //选择EZ Hero ezDownRoad = new Ez(); //EZ走下路 ezDownRoad.initRoad(new DownRoadService()); //确认选择 开始游戏(进入具体业务逻辑) ezDownRoad.game(); //选择亚索 Hero yaSuoMiddleRoad = new YaSuo(); //亚索走中路 yaSuoMiddleRoad.initRoad(new MiddleRoadService()); //确认选择 开始游戏(进入具体业务逻辑) yaSuoMiddleRoad.game(); //选择盲僧 Hero mangSengUpRoad = new MangSeng(); //盲僧走上路 mangSengUpRoad.initRoad(new UpRoadService()); //确认选择 开始游戏(进入具体业务逻辑) mangSengUpRoad.game(); } }
结果: