桥接模式是结构型模式
首先我们要了解桥接模式是什么,能干什么?
- 桥接模式从字面意思上就知道是用桥来连接,那我们要连接什么呢?
- 比如生产厂商电脑,电脑都是有类型有品牌的,类型+品牌=电脑,这里可以用到桥接
然后我们发现如果想要增加一款电脑是不是又要变动树结构而且品牌也不确定
下面用个流程图展示一下,怎么实现桥接?
我们把品牌和电脑类型相分离,然后生产电脑的时候,类型放一组,品牌放一组,到时候电脑类型通过桥接到品牌就能实现解耦,是电脑两边可以独立变化,当新增品牌也不用改变树结构,当需要用到的时候再把品牌加进
下面代码来实现:
Brand.java
品牌类
package 桥接模式;
//品牌
public interface Brand {
void info();
}
Apple.java
package 桥接模式;
//品牌
public class Apple implements Brand{
@Override
public void info() {
// TODO 自动生成的方法存根
System.out.println("苹果");
}
}
lenovo.java
package 桥接模式;
public class lenovo implements Brand{
@Override
public void info() {
// TODO 自动生成的方法存根
System.out.println("联想");
}
}
以上就是所有的品牌单独实现接口,下面写电脑类型的和桥接的地方
Computer.java
电脑生产每一个类型都会自带一个品牌属性,然后由每个类型继承下去的一个属性并且调用brand.info();品牌信息
这样的话生产完各种类型的电脑只需要传进来一个品牌即可实现 类型+品牌=电脑
package 桥接模式;
//抽象的电脑类型类
public abstract class Computer {
//组合,品牌,电脑出来就带品牌
//桥梁
protected Brand brand;
public Computer(Brand brand) {
this.brand = brand;
}
public void info() {
//自带品牌
brand.info();
}
}
class Desktop extends Computer{
public Desktop(Brand brand) {
super(brand);
// TODO 自动生成的构造函数存根
}
public void info() {
super.info();
System.out.println("台式机");
}
}
//增加电脑类型不需要理会品牌
class laptop extends Computer{
public laptop(Brand brand) {
super(brand);
// TODO 自动生成的构造函数存根
}
public void info() {
super.info();
System.out.println("笔记本");
}
}
下面来测试一下:
Test.java
package 桥接模式;
public class Test {
public static void main(String[] args) {
// TODO 自动生成的方法存根
//苹果笔记本
Computer computer=new laptop(new Apple()); //品牌和电脑类型相匹配连接
computer.info();
//联想台式机
Computer computer2=new Desktop(new lenovo());
computer2.info();
}
}
//测试结果
苹果
笔记本
联想
台式机
综上所述,实现了桥接之后我们可以随意的搭配品牌和电脑类型来组装成一个电脑,
优点:
- 解决了单继承的时候由于多个类造成的系统繁重
- 有灵活性,新增结构不会影响另一边,两边各自独立却又可以组合
缺点:
- 增加了代码的抽象和理解性,一旦读不懂可能就停步于此了
适用场景:
- JDBC和数据库,数据库有多种类型,业务代码也是有多种
- JVM和操作系统也是如此,操作系统有windows,linux,等等不同的系统使用不同的jvm操作的进程展现效果也不一样