小白谈谈桥接模式

概念

桥接模式就是将抽象部分与它的实现部分分离开来,使他们都可以独立变化。何为抽象?比如我觉得你很热心,热心这个词就属于一个抽象的概念,是我们脑子里觉得的一种形式,那么具体实现是什么,你扶老奶奶过马路,这是一个具体行为,我们看得见的。


实现

案例:今天我和女朋友去看电影,要去看什么电影呢?平时996的我哪有时间去了解现在有什么电影上映,等我们到了电影院,它们播什么我们就看什么呗。
首先定义一个电影的抽象类:

public abstract class Film {

    //定义一个方法,给子类实现
    protected abstract void show();
}

现在电影院热播钢铁侠和美女与野兽,接下来实现这两个类:

public class IronMan extends Film {

    @Override
    protected void show() {
        System.out.println("现在观看的是钢铁侠。");
    }
}
public class BeautyAndBeast extends Film{
    @Override
    protected void show() {
        System.out.println("现在播放的是美女与野兽。");
    }
}

最后就是我们去看电影的场景:

public class Client {

    public static void main(String[] args) {

        System.out.println("我们去看电影.");

        //有一天,我们去看钢铁侠
        IronMan ironMan = new IronMan();
        ironMan.show();

        //有一天,我们去看美女与野兽
        BeautyAndBeast beautyAndBeast = new BeautyAndBeast();
        beautyAndBeast.show();
    }
}

终于有一天,我的女朋友生气了,她说:“我们去电影院看电影,你也不问问我,我想看什么类型的电影。”女朋友这么生气,我觉得我不改不行啊,我得赶紧了解现在的电影都是什么类型的。
那我得给这些电影都添加一个电影类型,java类是单继承的,我如果在钢铁侠和美女与野兽的类中进行继承爱情电影,科幻电影,那么也是不可行的呀!将这些电影类型的类转换为接口?我这个案例比较简单,实际情况中可能这些类型的类还有实现方法,所以这就得用到我们的桥接模式。

类图如下:
在这里插入图片描述
定义一个电影的抽象类:

public abstract class Film {

    //定义一个方法,给子类实现
    protected abstract void show();
}

定义电影抽象部分的具体实现:

public class Romantic extends Film {
    @Override
    protected void show() {
        System.out.println("这个属于爱情电影。");
    }
}
public class ScienceFiction extends Film {
    @Override
    protected void show() {
        System.out.println("这是科幻电影。");
    }
}

定义一个电影的实现部分的抽象概念:

public abstract class FilmImpl {

    //定义一个电影对象,抽象概念的
    private Film film;

    //构造函数,由子类定义传递具体的电影
    public FilmImpl(Film film){
        this.film = film;
    }

    //定义一个播放的抽象方法
    public void show(){
        this.film.show();
    }
}

定义电影实现部分的具体实现

public class IronMan extends FilmImpl {

    //定义构造方法,把电影传进来
    public IronMan(Film film) {
        super(film);
    }

    public void show() {
        super.show();
        System.out.println("现在观看的是钢铁侠。");
    }
}
public class BeautyAndBeast extends FilmImpl {

    //定义构造方法,把电影传进来
    public BeautyAndBeast(Film film) {
        super(film);
    }


    public void show() {
        super.show();
        System.out.println("现在播放的是美女与野兽。");
    }
}

最后就是我们去看电影的情节了:

public class Client {

    public static void main(String[] args) {

        System.out.println("我们去看电影.");

        //有一天,我们去看科幻片——钢铁侠
        IronMan ironMan = new IronMan(new ScienceFiction());
        ironMan.show();
        System.out.println("女友开心起来了!");

        System.out.println("_______________________________________________________");

        //有一天,我们去看爱情片——美女与野兽
        BeautyAndBeast beautyAndBeast = new BeautyAndBeast(new Romantic());
        beautyAndBeast.show();
        System.out.println("女友开心起来了!");
    }
}

实验结果:
在这里插入图片描述

优点:将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。

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


参考文章:https://www.runoob.com/design-pattern/bridge-pattern.html
本文的代码:https://pan.baidu.com/s/1SzWRXI4O3y-M3FGzRx9ofg
提取码:cp1c

发布了48 篇原创文章 · 获赞 0 · 访问量 658

猜你喜欢

转载自blog.csdn.net/weixin_44943485/article/details/105262298
今日推荐