设计模式——外观模式

159 阅读2分钟

1. 外观模式概述

外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。
它向现有的系统添加一个接口,来隐藏系统的复杂性。
这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。

(1) 适用情况

用于简化系统复杂的内部结构,只需要由一个外观类对外提供接口即可。

(2) 优点

可以降低客户端和服务端之间的依赖。

(3) 缺点

修改比较麻烦,不符合开闭原则

2. 外观模式实例

我们还是用造车来举例,之前我们使用过工厂模式,这里适用外观模式来造车。

(1) 声明汽车接口

public interface Car {
    void declare();
}

(2) 实现具体的汽车类

public class Benz implements Car {
    @Override
    public void declare() {
        System.out.println("我是一辆奔驰。");
    }
}
public class BMW implements Car {
    @Override
    public void declare() {
        System.out.println("我是一辆宝马。");
    }
}
public class Audi implements Car {
    @Override
    public void declare() {
        System.out.println("我是一辆奥迪。");
    }
}

(3) 实现外观类

public class CarBuilder {
    private Car benz;
    private Car bmw;
    private Car audi;

    public CarBuilder() {
        this.benz = new Benz();
        this.bmw = new BMW();
        this.audi = new Audi();
    }

    public void buildBenz() {
        benz.declare();
    }

    public void buildBMW() {
        bmw.declare();
    }

    public void buildAudi() {
        audi.declare();
    }
}

(4) 使用外观类来造车

public class FacadeDemo {
    public static void main(String[] args) {
        CarBuilder carBuilder = new CarBuilder();
        carBuilder.buildBenz();
        carBuilder.buildBMW();
        carBuilder.buildAudi();
    }
}

运行结果:

image.png

3. 一些思考

对比工厂模式和外观模式:
工厂模式里,我们创建了一个汽车工厂,由汽车工厂提供方法,汽车工厂会根据这个方法的传参来判断应该生产什么汽车。
而在外观模式中,我们创建了一个外观类,在外观类中组合了各品牌汽车的实例,然后对外提供不同的方法,用于创建各个品牌的汽车。

如果在外观模式的CarBuilder中只实现一个buildCar方法,然后根据它的入参来生产不同品牌的汽车的话,感觉就与工厂模式更相似了。
实际上,它们最大的区别是,工厂模式是用来创建车的实例的,每次调用其接口都会新建一个新的实例,而这个实例具体用来干什么,工厂模式并不关心。
而外观模式是用来调用车的接口的,在初始化外观类的时候,已经创建好了各品牌车的实例,每次调用其接口不会创建新的实例,只是利用已经创建好的实例,来调用具体的方法。

参考引用

外观模式:www.runoob.com/design-patt…