设计模式(四)桥接模式

144 阅读1分钟

1.问题

需求:对不同手机类型的

不同品牌实现操作编程 image.png 传统方法:

image.png

缺点:

(1)类爆炸

(2)违反了单一职责原则,增加手机样式时,要同时增加所有品牌的手机。

2.基本介绍

桥接模式:是一种结构性设计模式,基于类的最小设计原则,将实现与抽象放在两个不同的层次中,使两个层次可以独立改变。

3.原理类图

image.png

Client类:模拟客户端

抽象类(Abstraction) : 维护了 Implementor 接口 ,即它的实现类是聚合关系,Abstraction充当桥接类

Implementor接口:行为实现类接口.

RefindedAbstraction:作为抽象类(Abstraction) 的子类;

ConcreteImplementA/B:具体实现类

4.解决问题

image.png

FolderPhone调用open,走的是父类的open,而父类中的open是通过接口找到vivo open Phone类似一个桥

public interface Brand {
    void open();
    void close();
    void call();
}

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("小米打电话");
    }
}

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打电话");
    }
}

public abstract class Phone {
    //组合品牌
    private Brand brand;
    //构造器
    public Phone(Brand brand) {
            super();
            this.brand = brand;
    }
    protected void open() {
            this.brand.open();
    }
    protected void close() {
            brand.close();
    }
    protected void call() {
            brand.call();
    }
}

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

    public void open() {
            super.open();
            System.out.println(" 折叠样式手机 ");
    }

    public void close() {
            super.close();
            System.out.println(" 折叠样式手机 ");
    }

    public void call() {
            super.call();
            System.out.println(" 折叠样式手机 ");
    }
}

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

}

JS没有经典应用