桥接模式bridge
桥接模式是将抽象部分与它的实现部分分离, 使它们都可以独立的变化. 它是一种对象结构型模式, 又称为柄体(Handle and Body)模式或接口(Interface)模式.
举个场景
需求: 已知有羽绒服、运动裤、跑步鞋三种衣物, 每种衣物有安踏、森马、乔丹三种品牌,设计出类的结构
传统的设计方式如上图,这种多重继承结构方式不好, 原因是:现在新增一个牌子,就要多写不少于3个类, 这样太麻烦,为什么会这么麻烦,是因为它违反了设计原则的单一职责原则, 最下层的类既要表示自己是啥品牌, 还要表示自己是啥衣物, 单个类职责太多我们不提倡
重新分析
这个场景中有两个变化的维度: 品牌、类型
如果我们只需要关心类型的实现, 而把品牌高度抽象(面向接口编程)是不是就会轻松许多? 哪怕品牌或者类型增加, 甚至维度增加都不怕了
代码实现
public interface Brand {
//这是什么品牌-->输出品牌名字
void info();
}
//安踏品牌
public class AnTa implements Brand {
@Override
public void info() {
System.out.print("安踏");
}
}
//森马品牌
public class SenMa implements Brand {
@Override
public void info() {
System.out.print("森马");
}
}
//泛指衣裤, 抽象类
public abstract class Clothe {
//产品出厂自带品牌
protected Brand brand;
//构造方法,封装的过程
public Clothe(Brand brand) {
this.brand = brand;
}
public void info(){
//是什么类型的衣物
brand.info();
}
}
//羽绒服
class DownJacket extends Clothe{
public DownJacket(Brand brand) {
super(brand);
}
@Override
public void info(){
brand.info();
System.out.println("羽绒服");
}
}
//运动裤
class Slacks extends Clothe{
public Slacks(Brand brand) {
super(brand);
}
@Override
public void info(){
brand.info();
System.out.println("运动裤");
}
}
测试方法以及结果
public class Test {
public static void main(String[] args) {
//生产一件森马羽绒服
Clothe clothe1 = new DownJacket(new SenMa());
clothe1.info();
//生产一条安踏运动裤
Clothe clothe2 = new Slacks(new AnTa());
clothe2.info();
}
}
在Clothe类中声明一个Brand类型的变量, 这样通过组合的方式好比是一座桥把品牌和类型这两个毫不相干的东西连起来了,所以称为桥接模式,也恰恰因为是它们毫不相干,彼此影响甚小,耦合度也得到有效降低,哪怕以后新增一个类型还是新增一个品牌,另外一边都不需要改动.
品牌和类型分离, 互不影响