桥接模式
一、介绍
桥接模式和适配器模式类似,包括以后经常会遇到意思接近一样的设计模式,因为大神往往就是多个模式混用,且根据不同的场景进行搭配,桥接设计模式也是结构型模式,将抽象部分与实现部分分离,使它们都可以独立的变化。通俗来说,是通过组合来桥接其它的行为/维度
二、场景
- 系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性
- 不想使用继承导致系统类的个数急剧增加的系统
- 有时候一个类,可能会拥有多个变化维度,比如啤酒,有不同的容量和品牌,可以使用继承组合的方式进行开发,假如维度很多,就容易出现类的膨胀,使用桥接模式就可以解决这个问题,且解耦
三、优缺点
- 优点
- 抽象和实现的分离。
- 优秀的扩展能力,符合开闭原则
- 缺点
- 增加系统的理解与设计难度
- 使用聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程,比如抽象类汽车,里面聚合了颜色类,有点像对象适配器
四、对比
桥接模式和适配器模式对比
- 按GOF的说法,桥接模式和适配器模式用于设计的不同阶段,
- 桥接模式用于设计的前期,精细化的设计,让系统更加灵活
- 适配器模式用于设计完成之后,发现类、接口之间无法一起工作,需要进行填坑
- 适配器模式经常用在第三方API协同工作的场合,在功能集成需求越来越多的今天,这种模式的使用频度越来越高,包括外观设计模式 ,这个也是某些场景和适配器模式一样
五、代码
抽象产品类,手机phone
package com.lcy.study.design.bridge;
import com.lcy.study.design.factory.Color;
import lombok.Getter;
import lombok.Setter;
/**
* @Description 抽象产品类
* @Author lcy
* @Date 2021/7/21 11:37
*/
public abstract class Phone {
@Getter
@Setter
protected Color color;
/**
* 运行
* @author lcy
* @date 2021/7/21 11:39
**/
public abstract void run();
/**
* 充电
* @author lcy
* @date 2021/7/21 11:39
**/
public abstract void recharge();
}
配件接口Color
package com.lcy.study.design.factory;
/**
* @Description 汽车颜色
* @Author lcy
* @Date 2021/7/20 12:00
*/
public interface Color {
/**
* 获取汽车颜色
* @return java.lang.String
* @author lcy
* @date 2021/7/20 12:01
**/
String getColor();
}
具体配件类RedColor
package com.lcy.study.design.factory;
/**
* @Description 红色
* @Author lcy
* @Date 2021/7/20 12:01
*/
public class RedColor implements Color{
@Override public String getColor(){
return "red";
}
}
具体产品类iphone
package com.lcy.study.design.bridge;
import com.lcy.study.design.factory.Color;
import com.lcy.study.design.factory.RedColor;
/**
* @Description 苹果手机
* @Author lcy
* @Date 2021/7/21 11:41
*/
public class Iphone extends Phone {
public Iphone(Color color){
this.color = color;
}
@Override public void run(){
System.out.println("苹果手机正在运行");
}
@Override public void recharge(){
System.out.println("苹果手机正在充电");
}
@Override public String toString(){
return String.format("this is %s iphone",color.getColor());
}
public static void main(String[] args){
Phone phone = new Iphone(new RedColor());
System.out.println(phone);
}
}