Java OpenResty Spring Spring Boot MySQL Redis MongoDB PostgreSQL Linux Android Nginx 面试 小程序 Arthas JVM AQS juc Kubernetes Docker 诊断工具


设计模式之桥接模式

设计模式 Java 大约 2638 字

作用

解决类爆炸问题,将抽象部分与它的实现部分相分离,使他们可以独立的变化。

原理图

bridge.png

Abstraction:维护了Implementor与它的实现类ConcreteImplementorA/B,Abstraction与Implementor是聚合关系,Abstraction充当桥接类。

RefineAbstraction:是抽象类Abstraction的子类

Implementor:行为实现类的接口

ConcreteImplementorA/B:行为的具体实现类

案例

bridge2.png

Abstraction

桥接抽象类-手机

public abstract class Phone {

    private Brand brand;//聚合品牌

    public Phone(Brand brand) {
        this.brand = brand;
    }

    protected void open() {
        brand.open();
    }

    protected void close() {
        brand.close();
    }

    protected void call() {
        brand.close();
    }

}

Implementor

行为实现类的接口-品牌

public interface Brand {

    void open();

    void close();

    void call();

}

ConcreteImplementorA

行为的具体实现类-小米手机

public class XiaoMi implements Brand {
    @Override
    public void open() {
        System.out.println("小米手机开机");
    }

    @Override
    public void close() {
        System.out.println("小米手机关机");
    }

    @Override
    public void call() {
        System.out.println("小米手机打电话");
    }
}

ConcreteImplementorB

行为的具体实现类-Vivo手机

public class Vivo implements Brand {
    @Override
    public void open() {
        System.out.println("Vivo手机开机");
    }

    @Override
    public void close() {
        System.out.println("Vivo手机关机");
    }

    @Override
    public void call() {
        System.out.println("Vivo手机打电话");
    }
}

RefineAbstraction

实现抽象类的子类-翻盖手机

public class FoldedPhone extends Phone {

    public FoldedPhone(Brand brand) {
        super(brand);
    }

    @Override
    public void open() {
        super.open();
        System.out.println("翻盖手机-开机");
    }

    @Override
    public void close() {
        super.close();
        System.out.println("翻盖手机-关机");
    }

    @Override
    public void call() {
        super.call();
        System.out.println("翻盖手机-打电话");
    }
}

实现抽象类的子类-直板手机

public class UpRightPhone extends Phone {
    public UpRightPhone(Brand brand) {
        super(brand);
    }

    @Override
    public void open() {
        super.open();
        System.out.println("直板手机-开机");
    }

    @Override
    public void close() {
        super.close();
        System.out.println("直板手机-关机");
    }

    @Override
    public void call() {
        super.call();
        System.out.println("直板手机-打电话");
    }
}

Client

调用

public class Client {
    public static void main(String[] args) {
        Phone phone1 = new FoldedPhone(new XiaoMi());
        phone1.open();
        phone1.call();
        phone1.close();

        System.out.println("----------------");

        Phone phone2 = new UpRightPhone(new Vivo());
        phone2.open();
        phone2.call();
        phone2.close();
    }
}
阅读 2782 · 发布于 2019-12-17

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb

扫描下方二维码关注公众号和小程序↓↓↓

扫描二维码关注我
昵称:
随便看看 换一批