桥接模式用处很多,最熟知的就是JDBC的使用场景,大家都知道。我们切换数据源的时候只需要改动驱动名称,连接信息,用户名,密码信息就可以切换数据库了。
1.意图
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
2.特点
1.把对象的创建与应用分离,交给调用者去根据具体情况创建不同的类。
2.通过桥接类去调用对象的具体方法。
3.UML类图
JDBC的类图如下
4.代码实现
/**
* 资源接口
* 定义具体方法
*/
public interface Eat {
void eatChicken();
void eatFish();
}
/**
* 资源类的具体实现类 筷子
* 实现资源接口的方法
*/
public class Chopsticks implements Eat {
@Override
public void eatChicken() {
System.out.println("用筷子吃鸡");
}
@Override
public void eatFish() {
System.out.println("用筷子吃鱼");
}
}
/**
* 资源类的具体实现类 叉子
* 实现资源接口的方法
*/
public class Fork implements Eat {
@Override
public void eatChicken() {
System.out.println("用叉子吃鸡");
}
@Override
public void eatFish() {
System.out.println("用叉子吃鱼");
}
}
/**
* 资源类的具体实现类 勺子
* 实现资源接口的方法
*/
public class Spoon implements Eat {
@Override
public void eatChicken() {
System.out.println("用勺子吃鸡");
}
@Override
public void eatFish() {
System.out.println("用勺子吃鱼");
}
}
/**
* 桥接类(抽象)
* 1,持有资源类
* 2,定义与资源类相同的方法
*/
public abstract class Birdge {
private Eat eat;
public abstract void eatChicken();
public abstract void eatFish();
public Birdge(Eat eat) {
this.eat = eat;
}
public Eat getEat() {
return eat;
}
public void setEat(Eat eat) {
this.eat = eat;
}
}
/**
* 桥接类的具体实现类
* 1,对具体的资源类赋值
* 2,调用具体的资源类方法
*/
public class MyBirdge extends Birdge {
public MyBirdge(Eat eat) {
super(eat);
}
@Override
public void eatChicken() {
getEat().eatChicken();
}
@Override
public void eatFish() {
getEat().eatFish();
}
}
public class Client {
public static void main(String[] args) {
//根据具体情况 创建具体的 资源实体类
Eat eat = new Fork();
//将资源类赋值给具体桥接类
Birdge birdge = new MyBirdge(eat);
//调用具体方法
birdge.eatFish();
}
}