1. 桥接模式(Bridge Pattern)
桥接模式是一种对象结构型模式,是将抽象部分与它的实现部分 分离,使它们都可以独立地变化,其主要对象有:
- Abstraction:抽象类
- RefinedAbstraction:抽象类的具体实现
- Implementor:实现类接口
- ConcreteImplementor:具体实现类
JDBC中,Class.forName(“com.mysql.jdbc.Driver”),加载类的静态代码块就使用了桥接模式
2. 流程
举例需求:这里有猫和狗,猫会玩
这个功能,狗会吃
这个功能,但不满足于此,怎么给猫和狗增加一个睡
功能呢?这里增加一个鸟动物,鸟增加一个唱
功能怎么实现?这种动物
和功能
互相组合可以用桥接模式来实现
2.1 实现类接口
代码语言:javascript复制public interface AbstractFunction {
public abstract void doFunction();
}
2.2 具体实现类
代码语言:javascript复制// 吃功能
public class EatFun implements AbstractFunction {
@Override
public void doFunction() {
System.out.println("吃的功能");
}
}
代码语言:javascript复制// 玩功能
public class PlayFun implements AbstractFunction {
@Override
public void doFunction() {
System.out.println("玩的功能");
}
}
代码语言:javascript复制// 睡功能
public class SleepFun implements AbstractFunction {
@Override
public void doFunction() {
System.out.println("睡的功能");
}
}
2.3 抽象类
代码语言:javascript复制public abstract class AbstractAnimal {
private AbstractFunction af;
public void setAf(AbstractFunction af) {
this.af = af;
}
public abstract void doSomething();
}
2.4 抽象类的具体实现
代码语言:javascript复制// 猫
public class CatAnimal extends AbstractAnimal {
@Override
public void doSomething() {
System.out.println("猫增加了");
af.doFunction();
}
}
代码语言:javascript复制// 狗
public class DogAnimal extends AbstractAnimal {
@Override
public void doSomething() {
System.out.println("狗增加了");
af.doFunction();
}
}
2.5 测试
代码语言:javascript复制public class test {
public static void main(String[] args) {
PlayFun pf = new PlayFun();
CatAnimal cat = new CatAnimal();
cat.setAf(pf);
cat.doSomething();
System.out.println("n---------人工分割线-----------n");
EatFun ef = new EatFun();
DogAnimal dog = new DogAnimal();
dog.setAf(ef);
dog.doSomething();
System.out.println("---------人工分割线-----------");
dog.setAf(pf);
dog.doSomething();
}
}
代码语言:javascript复制猫增加了
玩的功能
---------人工分割线-----------
狗增加了
吃的功能
---------人工分割线-----------
狗增加了
玩的功能
3. 动态扩展
改动抽象类
代码语言:javascript复制public abstract class AbstractAnimal {
// 内部维护功能集合
public ArrayList<AbstractFunction> af = new ArrayList();
// 添加元素
public void addAf(AbstractFunction af) {
this.af.add(af);
}
public abstract void doSomething();
}
改动测试类
代码语言:javascript复制public class test {
public static void main(String[] args) {
EatFun ef = new EatFun();
PlayFun pf = new PlayFun();
SleepFun sf = new SleepFun();
DogAnimal dog = new DogAnimal();
dog.addAf(ef);
dog.addAf(pf);
dog.addAf(sf);
dog.doSomething();
}
}
代码语言:javascript复制狗增加了
吃的功能
玩的功能
睡的功能