桥接模式

2020-03-10 10:47:29 浏览数 (1)


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复制
狗增加了
吃的功能
玩的功能
睡的功能

0 人点赞