Java23种设计模式之桥接模式

102 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 ​

一,场景

在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式。

比如汽车在路上行驶的来说。即有小汽车又有公共汽车,它们都不但能在市区中的公路上行驶,也能在高速公路上行驶。这你会发现,对于交通工具(汽车)有不同的类型,然而它们所行驶的环境(路)也在变化,在软件系统中就要适应两个方面的变化?怎样实现才能应对这种变化呢?

二,优缺点

优点: 1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。

**缺点:**桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

三,实现

不同的人开着不同的汽车在不同的路上行驶(三个维度)

​编辑

不同维度的接口

//路
public abstract class AbstractRoad {

    protected AbstractCar car;

    public abstract void run();
}

//车
public abstract class AbstractCar {

    public abstract void run();

}

//人
public abstract class AbstractPeople {

    protected AbstractRoad road;

    public abstract void run();

}

车实现类

public class Bus extends AbstractCar {

    @Override
    public void run() {
        System.out.println("公共汽车在");
    }
}

public class Car extends AbstractCar {

    @Override
    public void run() {
        System.out.println("小汽车在");
    }
}

路实现类

public class SpeedWay extends AbstractRoad {

    @Override
    public void run() {
        car.run();
        System.out.println("高速公路上行驶");
    }
}

public class Street extends AbstractRoad {

    @Override
    public void run() {
        car.run();
        System.out.println("市区街道上行驶");
    }
}

人实现类

public class Man extends AbstractPeople {

    @Override
    public void run() {
        System.out.println("男人开着");
        road.run();
    }
}

public class WoMan extends AbstractPeople {

    @Override
    public void run() {
        System.out.println("女人开着");
        road.run();
    }
}

测试

public class TestMain {

    public static void main(String[] args) {

        //小汽车在高速公路上行驶;
        AbstractRoad abstractRoad = new SpeedWay();
        abstractRoad.car = new Car();
        abstractRoad.run();

        System.out.println("====================");

        //公共汽车在高速公路上行驶;
        AbstractRoad abstractRoad2 = new Street();
        abstractRoad2.car = new Bus();
        abstractRoad2.run();

        System.out.println("====================");

        AbstractPeople people = new Man();
        people.road = abstractRoad;
        people.run();

        System.out.println("====================");

        AbstractPeople people2 = new WoMan();
        people2.road = abstractRoad2;
        people2.run();

        System.out.println("====================");

    }
}

小汽车在
高速公路上行驶
====================
公共汽车在
高速公路上行驶
====================
男人开着
小汽车在
高速公路上行驶
====================
女人开着
公共汽车在
高速公路上行驶
====================