【设计模式专题】用英雄联盟案例来讲解—桥接模式

37 阅读3分钟

“携手创作,共同成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第十四天,点击查看活动详情

一、为什么要使用桥接模式

1.1 定义

桥接模式(bridge):抽象与实现分离,二者可以独立变化,用组合关系代替继承关系,降低了耦合度

1.2 优点

降低耦合度,扩展性强,细节对客户透明

1.3 缺点

设计难度大,对系统要有深入的理解

1.4 使用场景

一个类有两个独立变化的维度

1.5 链路类图

v

二、桥接模式代码实现(常规写法)

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();
    }
}

结果:

在这里插入图片描述