上文(适配器模式): https://blog.csdn.net/qq_16498553/article/details/106484298
背景
日常生活中,每家每户都是有电视机的,但是相同的电脑机可能不同的型号就会出现只能专机专用遥控器,这样一来家里要是有几个房间,可否统一成一个遥控器来控制?
桥梁模式是什么?
桥梁模式是结构型模式的一种。将实现和抽象进行解耦,起到一个低偶高内聚,使抽象和实现都可以独立的变化。
桥梁模式可以干什么?
主要是解决继承方面存在缺陷而设计,一个类想要拥有另外一个类的功能,可能不需要继续,只需要铺设一个桥梁(引用)架过去可以了。
优点
可以从接口中分离实现的功能,使设计更具拓展性、耦合性降低,这样使用方根本不需要知道实现的细节,解决继承而导致非常多的弊端导致的问题;
缺点
抽象类与实现类双向连接使得运行速度减慢。
桥梁模式类图
角色
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(),"小米手机");
}
}
结果:
华为手机
支持视频!
小米手机
不支持视频