Java设计模式--桥接模式

1 Bridge Pattern 桥接模式

目的:将类的功能层次与实现层次结构分离;
实现:不关心生成产品的具体实现,只关心接口,仅使用接口生成产品。

1.如果某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合“单一职责原则;
2.与多层继承方案不同,它将两个独立变化的维度设计为两个独立的继承等级结构,并且在抽象层建立一个抽象关联,该关联关系类似一条连接两个独立继承结构的桥;
3.桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联取代了传统的多层继承,将类之间的静态继承关系转换为动态的对象组合关系,使得系统更加灵活,并易于扩展,同时有效控制了系统中类的个数;
4.桥接模式中体现了很多面向对象设计原则的思想,包括“单一职责原则”、“开闭原则”、“合成复用原则”、“里氏代换原则”、“依赖倒转原则”;
5.继承是强关联,委托是弱关联。

2 实现

代码场景:现在手机厂商的生成模式是,手机厂商设计产品,具体的生产组装交给代工厂来执行:
手机的设计与生产时两个维度,因此可以独立进行。

2.1 代码实现

手机接口

public interface MobilePhone {
    // 手机名字
    String getName();
}

手机实现类:小米手机

public class XiaoMi implements MobilePhone {
    private final String name = "小米Mix2";

    public XiaoMi() {
        System.out.println("200人设计团队~");
        System.out.println("500张设计草图~");
        System.out.println("1000小时头脑风暴~");
        System.out.println("20000次跌落试验~");
        System.out.println("小米手机:一面科技,一面艺术~");
        System.out.println("----------------[" + name + "]研发结束-----------------");
    }

    public String getName() {
        return name;
    }
}

手机实现类:锤子手机

public class ChuiZi implements MobilePhone {
    private final String name = "坚果Pro3";

    public ChuiZi() {
        System.out.println("锤子手机:工匠雕琢~~!");
        System.out.println("----------------[" + name + "]研发结束-----------------");
    }

    public String getName() {
        return name;
    }
}

桥接抽象类:生产

public abstract class AbstractBridgeProduct {
    protected MobilePhone re;
    // 无论是构造器 还是set方法 只要注入就好
    public AbstractBridgeProduct(MobilePhone re) {
        this.re = re;
    }
    public abstract void productMobile();
}

桥接具体实现类

public class FactoryProduct extends AbstractBridgeProduct {

    public FactoryProduct(MobilePhone re) {
        // 调用父类构造器
        super(re);
    }

    @Override
    public void productMobile() {
        System.out.println("[" + re.getName() + "]经富士康5号流水线工人组装完成~");
        System.out.println("[" + re.getName() + "]经富士康5号流水线质检张全蛋检查完毕~");
        System.out.println("[" + re.getName() + "]手机生产完毕~");
        System.out.println("----------------[" + re.getName() + "]研发结束-----------------");
    }

}

2.2 涉及角色

在桥接模式结构图中包含如下几个角色:

Abstraction(抽象类):用于定义抽象类的接口,它一般是抽象类而不是接口,其中定义了一个 Implementor(实现类接口)类型的对象并可以维护该对象,它与 Implementor 之间具有关联关系,它既可以包含抽象业务方法,也可以包含具体业务方法。

RefinedAbstraction(扩充抽象类):扩充由 Abstraction 定义的接口,通常情况下它不再是抽象类而是具体类,它实现了在 Abstraction 中声明的抽象业务方法,在 RefinedAbstraction 中可以调用在 Implementor 中定义的业务方法。

Implementor(实现类接口):定义实现类的接口,这个接口不一定要与 Abstraction 的接口完全一致,事实上这两个接口可以完全不同,一般而言,Implementor 接口仅提供基本操作,而 Abstraction 定义的接口可能会做更多更复杂的操作。Implementor 接口对这些基本操作进行了声明,而具体实现交给其子类。通过关联关系,在 Abstraction 中不仅拥有自己的方法,还可以调用到 Implementor 中定义的方法,使用关联关系来替代继承关系。

ConcreteImplementor(具体实现类):具体实现 Implementor 接口,在不同的 ConcreteImplementor 中提供基本操作的不同实现,在程序运行时,ConcreteImplementor 对象将替换其父类对象,提供给抽象类具体的业务操作方法。

2.3 调用

调用者:

public class Client {
    public static void main(String[] args) {
        AbstractBridgeProduct xm = new FactoryProduct(new XiaoMi());
        AbstractBridgeProduct cz = new FactoryProduct(new ChuiZi());

        xm.productMobile();
        cz.productMobile();
    }

}

结果:

200人设计团队~
500张设计草图~
1000小时头脑风暴~
20000次跌落试验~
小米手机:一面科技,一面技术~
----------------[小米Mix2]研发结束-----------------
锤子手机:工匠雕琢~~!
----------------[坚果Pro3]研发结束-----------------
[小米Mix2]经富士康5号流水线工人组装完成~
[小米Mix2]经富士康5号流水线质检张全蛋检查完毕~
[小米Mix2]手机生产完毕~
----------------[小米Mix2]研发结束-----------------
[坚果Pro3]经富士康5号流水线工人组装完成~
[坚果Pro3]经富士康5号流水线质检张全蛋检查完毕~
[坚果Pro3]手机生产完毕~
----------------[坚果Pro3]研发结束-----------------

代码地址:点击跳转

参考文献:
[ 1 ] 图解设计模式/(日)结城浩著;杨文轩译。–北京:人民邮电出版社,2017.1.
[ 2 ] 维基百科 设计模式
[ 3 ] 极客学院WIKI–设计模式.
[ 4 ] 菜鸟教程–设计模式.

猜你喜欢

转载自blog.csdn.net/weixx3/article/details/80161454