设计模式-桥梁模式

时间:2022-07-25
本文章向大家介绍设计模式-桥梁模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

背景

日常生活中,每家每户都是有电视机的,但是相同的电脑机可能不同的型号就会出现只能专机专用遥控器,这样一来家里要是有几个房间,可否统一一个遥控器来控制?

桥梁模式是什么?

桥梁模式是结构型模式的一种。将实现和抽象进行解耦,起到一个低偶高内聚,使抽象和实现都可以独立的变化。

桥梁模式可以干什么?

主要是解决继承方面存在缺陷而设计,一个类想要拥有另外一个类的功能,可能不需要继续,只需要铺设一个桥梁(引用)架过去可以了。

优点

  • 可以从接口中分离实现的功能,使设计更具拓展性、耦合性降低,这样使用方根本不需要知道实现的细节,解决继承而导致非常多的弊端导致的问题;

缺点

  • 抽象类与实现类双向连接使得运行速度减慢。

桥梁模式类图

角色

Abstraction(抽象类):用于定义抽象类的接口,它一般是抽象类而不是接口,其中定义了一个Implementor(实现类接口)类型的对象并可以维护该对象,它与Implementor之间具有关联关系,它既可以包含抽象业务方法,也可以包含具体业务方法。

RefinedAbstraction(扩充抽象类):扩充由Abstraction定义的接口,通常情况下它不再是抽象类而是具体类,它实现了在Abstraction中声明的抽象业务方法,在RefinedAbstraction中可以调用在Implementor中定义的业务方法。

Implementor(实现类接口):定义实现类的接口,这个接口不一定要与Abstraction的接口完全一致,事实上这两个接口可以完全不同,一般而言,Implementor接口仅提供基本操作,而Abstraction定义的接口可能会做更多更复杂的操作。Implementor接口对这些基本操作进行了声明,而具体实现交给其子类。通过关联关系,在Abstraction中不仅拥有自己的方法,还可以调用到Implementor中定义的方法,使用关联关系来替代继承关系。

ConcreteImplementor(具体实现类):具体实现Implementor接口,在不同的ConcreteImplementor中提供基本操作的不同实现,在程序运行时,ConcreteImplementor对象将替换其父类对象,提供给抽象类具体的业务操作方法。

现实举例

比如:我们的手机,有各种各样的品牌,琳琅满目数都数不过来,但是大部分手机厂商的功能都是相同的,就比如华为手机荣耀系统,原来有打电话的功能,现在在电话功能增加一个视频的功能,只需要升级一下软件就OK,总不能让直接回厂或换部手机。所以这样一来就...

(Abstraction)手机是一个抽象类、

(Implementor)手机实现的基础功能、

(RefinedAbstraction)增加的功能比如视频、会议等

(ConcreteImplementor)不同品牌比如华为、OPPO、小米...

建议先把逻辑理清楚再继续...总之一个句,这个模式是搭桥用的...你就可以走过河对岸了...

源码下载:https://gitee.com/hong99/design-model/issues/I1IMES

代码实现

/**
 * @Auther: csh
 * @Date: 2020/5/15 16:51
 * @Description:手机抽象
 */
public class MobileAbstraction {
    protected ViewFunction viewFunction;
    /** 品牌*/
    private String brand;

    public MobileAbstraction(ViewFunction viewFunction, String brand) {
        this.viewFunction = viewFunction;
        this.brand = brand;
    }


    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }
}
/**
 * @Auther: csh
 * @Date: 2020/5/15 16:54
 * @Description:视频抽象
 */
public abstract class ViewFunction
{
    //视频功能
    public abstract void view(Boolean isView);
}
/**
 * @Auther: csh
 * @Date: 2020/5/15 16:57
 * @Description:
 */
public class HuaWeiMobile extends MobileAbstraction {

    public HuaWeiMobile(ViewFunction viewFunction, String brand) {
        super(viewFunction, brand);
        System.out.println("华为手机");
        viewFunction.view(true);
    }
}
/**
 * @Auther: csh
 * @Date: 2020/5/15 16:58
 * @Description:
 */
public class XiaoMiMobile extends MobileAbstraction {
    public XiaoMiMobile(ViewFunction viewFunction, String brand) {
        super(viewFunction, brand);
        System.out.println("小米手机");
        viewFunction.view(false);
    }
}
/**
 * @Auther: csh
 * @Date: 2020/5/15 17:01
 * @Description:功能实现
 */
public class SupportViewFunction extends ViewFunction {


    @Override
    public void view(Boolean isView) {
        if(isView){
            System.out.println("支持视频!");
        }else{
            System.out.println("不支持视频!");
        }
    }
}
/**
 * @Auther: csh
 * @Date: 2020/5/15 16:59
 * @Description:
 */
public class Client {
    public static void main(String[] args) {
        MobileAbstraction mobile = new HuaWeiMobile(new SupportViewFunction(),"华为手机");
        MobileAbstraction mobile2= new XiaoMiMobile(new SupportViewFunction(),"小米手机");


    }
}
结果:
华为手机
支持视频!
小米手机
不支持视频

参考书籍:

【大话设计模式】

【设计模式之禅】

【研磨设计模式】

源码下载:https://gitee.com/hong99/design-model/issues/I1IMES