桥接模式Bridge
最体现(聚合复用原则)
将抽象部分与他的实现部分分离,使他们都可以独立地变化
Abstraction:持有一个Implementor引用,即可包含抽象方法也可包含实例方法,所以一般是个抽象类(分离部分实现);
RefinedAbstraction:具体类 实现抽象方法,使用Implementor中方法
Implementpr:实现部分接口 声明要实现的抽象方法(接口)
ConcreteImplementor:具体方法实现类
实现部分是指 其抽象类和他的派生类用来实现的对象,让实现独立,使得它们各自的变化,而不会影响彼此,减小耦合。并且避免过度的继承使得子类过于臃肿
找出变化并封装
使用场景
实现系统有多角度分类,每一种分类都可能有变化。
继承体系中,有两个甚至多个方向的变化,那么就解耦这些不同方向的变化,通过对象组合的方式,把两个角色之间的继承关系改为了组合的
关系,从而使这两者可以应对各自独立的变化。
与适配器模式差异
适配器包裹的是一个 我们可能无法更改或者扩展其功能的类,我们仅仅想要在接口不兼容时使用要被包裹的类的某些功能,一般用于第三方系统与现有系统的继承。
桥接模式则不同,桥接模式本身是为了更好的扩展,采用接口或者继承的方式
与装饰模式的差异
桥接模式本身类并不稳定,我们想要它向多方面扩展;不断的为其插入实现
装饰模式本身要装饰的类是稳定的,我们通过包裹它来为其增加功能,这是动态的,可可在不需要时撤销享有的职责
实例
Abstraction
public abstract class Abstraction {
protected Implement implement;
public Abstraction(Implement implement) {
this.implement = implement;
}
public abstract void method();
}
RefinedAbstraction:
public class ConcreteAbstraction extends Abstraction {
public ConcreteAbstraction(Implement implement) {
super(implement);
}
@Override
public void method() {
this.implement.method();
}
}
Implementor:
public interface Implement {
void method();
}
ConcreteImplementor:
public class Concrete1 implements Implement{
@Override
public void method() {
System.out.println("执行方法1");
}
}
public class Concrete2 implements Implement{
@Override
public void method() {
System.out.println("执行方法2");
}
}
测试
public class Test {
public static void main(String[] args) {
Implement i1 = new Concrete1();
Implement i2 = new Concrete2();
Abstraction abstraction = new ConcreteAbstraction(i2);
abstraction.method();
}
}