桥接模式
定义:将抽象部分与它的实现部分分离,是它们可以独立变化。
怎么理解呢?举个例子,不同的手机品牌商可能会有不同的软件的实现,比如安卓手机和果子手机的软件就有不同。那么我们可以有两种角度划分架构
但是我们如果想要增加一个品牌和一个软件需要增加大量类去实现。实现系统有多角度的,每种角度的分类的都可能变化,那么我们可以把这些角度分离出来,让它们独立变化,减少它们之间的耦合。上面的例子可以演化成
如此,增加一个品牌或者增加一个软件都只需要增加一个类。
由此,介绍设计模式的一个原则,合成/聚合复用原则——尽量使用合成/聚合,尽量不适用类继承
那么合成和聚合是什么呢?合成是一种强拥有的关系,体现严格的部分与整体的关系,部分和整体的生命周期一样,就像人和他的四肢。聚合的一种弱拥有的关系,体现的是A对象可以拥有B对象,但B对象不是A对象的一部分,如同程序员可能有你,但你未必是程序员的一部分。
桥接模式是抽象与实现相分离,抽象含有实现,实现未必是抽象的一部分,抽象使用的实现可以是多种是实现。这里的实现并非是实现类意义上的实现,而是一种“工具”上实现。下面是代码
/**
* @author 州牧
* @description 抽象类
* @since 2022-03-27 20:39
*/
public class Abstraction {
protected Implementor implementor;
public void setImplementor(Implementor implementor){
this.implementor = implementor;
}
public void operation(){
implementor.operation();
}
}
public class RefinedAbstraction1 extends Abstraction{
@Override
public void operation() {
implementor.operation();
}
}
public class RefinedAbstraction2 extends Abstraction{
@Override
public void operation() {
implementor.operation();
}
}
/**
* @author 州牧
* @description 抽象包含的实现
* @since 2022-03-27 20:36
*/
public abstract class Implementor {
public abstract void operation();
}
/**
* @author 州牧
* @description
* @since 2022-03-27 20:37
*/
public class DemoImplementor1 extends Implementor {
@Override
public void operation() {
System.out.println("具体的操作一");
}
}
public class DemoImplementor2 extends Implementor {
@Override
public void operation() {
System.out.println("具体的操作二");
}
}
/**
* @author 州牧
* @description
* @since 2022-03-27 20:52
*/
public class Client {
public static void main(String[] args) {
System.out.println("抽象类一:");
Abstraction rab1 = new RefinedAbstraction1();
rab1.setImplementor(new DemoImplementor1());
rab1.operation();
System.out.println("抽象类二");
Abstraction rab2 = new RefinedAbstraction2();
rab2.setImplementor(new DemoImplementor2());
rab2.operation();
rab2.setImplementor(new DemoImplementor1());
rab2.operation();
}
}
/*
抽象类一:
具体的操作一
抽象类二
具体的操作二
具体的操作一
*/