桥接模式

Posted howlet

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了桥接模式相关的知识,希望对你有一定的参考价值。



1. 桥接模式(Bridge Pattern)

桥接模式是一种对象结构型模式,是将抽象部分与它的实现部分 分离,使它们都可以独立地变化,其主要对象有:

  • Abstraction:抽象类
  • RefinedAbstraction:抽象类的具体实现
  • Implementor:实现类接口
  • ConcreteImplementor:具体实现类

JDBC中,Class.forName(“com.mysql.jdbc.Driver”),加载类的静态代码块就使用了桥接模式




2. 流程

举例需求:这里有猫和狗,猫会这个功能,狗会这个功能,但不满足于此,怎么给猫和狗增加一个功能呢?这里增加一个鸟动物,鸟增加一个功能怎么实现?这种动物功能互相组合可以用桥接模式来实现


2.1 实现类接口

public interface AbstractFunction {
    
    public abstract void doSomething();
}


2.2 具体实现类

// 吃功能
public class EatFun implements AbstractFunction {

    @Override
    public void doFunction() {
        System.out.println("吃的功能");
    }
}
// 玩功能
public class PlayFun implements AbstractFunction {

    @Override
    public void doFunction() {
        System.out.println("玩的功能");
    }
}
// 睡功能
public class SleepFun implements AbstractFunction {

    @Override
    public void doFunction() {
        System.out.println("睡的功能");
    }
}


2.3 抽象类

public abstract class AbstractAnimal {
    
    private AbstractFunction af;
    
    public void setAf(AbstractFunction af) {
        this.af = af;
    }

    public abstract void doSomething();
}


2.4 抽象类的具体实现

// 猫
public class CatAnimal extends AbstractAnimal {

    @Override
    public void doSomething() {
        System.out.println("猫增加了");
        af.doFunction();
    }
}
// 狗
public class DogAnimal extends AbstractAnimal {

    @Override
    public void doSomething() {
        System.out.println("狗增加了");
        af.doFunction();
    }
}


2.5 测试

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("
---------人工分割线-----------
");
        
        EatFun ef = new EatFun();
        DogAnimal dog = new DogAnimal();
        
        dog.setAf(ef);
        dog.doSomething();
        System.out.println("---------人工分割线-----------");
        dog.setAf(pf);
        dog.doSomething();
    }
}
猫增加了
玩的功能

---------人工分割线-----------

狗增加了
吃的功能
---------人工分割线-----------
狗增加了
玩的功能




3. 动态扩展

改动抽象类

public abstract class AbstractAnimal {
    
    // 内部维护功能集合
    public ArrayList<AbstractFunction> af = new ArrayList();
    
    // 添加元素
    public void addAf(AbstractFunction af) {
        this.af.add(af);
    }

    public abstract void doSomething();
}

改动测试类

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();
    }
}
狗增加了
吃的功能
玩的功能
睡的功能




以上是关于桥接模式的主要内容,如果未能解决你的问题,请参考以下文章

桥接模式 C++ 代码编译错误

案例分析:设计模式与代码的结构特性

桥接模式-代码实现

23种设计模式之桥接模式代码实例

设计模式之桥接模式

桥接模式