← 返回首页
设计模式基础教程(十九)
发表时间:2021-08-25 19:47:22
外观模式

1.外观模式

外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。

根据“单一职责原则”,在软件中将一个系统划分为若干个子系统有利于降低整个系统的复杂性,一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小,而达到该目标的途径之一就是引入一个外观对象,它为子系统的访问提供了一个简单而单一的入口。

外观模式也是“迪米特法则”的体现,通过引入一个新的外观类可以降低原有系统的复杂度,同时降低客户类与子系统类的耦合度。

2.实例

现在考察一个电源总开关的例子,以便进一步说明外观模式。为了使用方便,一个电源总开关可以控制四盏灯、一个风扇、一台空调和一台电视机的启动和关闭。通过该电源总开关可以同时控制上述所有电器设备,使用外观模式设计该系统。

项目结构图如下:

定义电器抽象类

public abstract class Appliance {
    protected abstract void on();
    protected abstract void off();
}

定义电灯类

public class Light extends Appliance {
    private String position;
    public Light(String position){
        this.position=position;
    }
    @Override
    public void on(){
        System.out.println(this.position+"灯打开!");
    }
    @Override
    public void off(){
        System.out.println(this.position+"灯关闭!");
    }
}

定义电视类

public class Television extends Appliance {
    @Override
    public void on(){
        System.out.println("电视打开");
    }
    @Override
    public void off(){
        System.out.println("电视关闭");
    }
}

定义风扇类

public class Fan extends Appliance {
    @Override
    public void on(){
        System.out.println("风扇打开");
    }
    @Override
    public void off(){
        System.out.println("风扇关闭");
    }
}

定义空调类

public class AirConditioner extends Appliance{
    @Override
    public void on(){
        System.out.println("空调打开");
    }
    @Override
    public void off(){
        System.out.println("空调关闭");
    }
}

定义开关类

public class GeneralSwitchFacade {

    private Light[] lights=new Light[4];
    private Fan fan;
    private AirConditioner airConditioner;
    private Television television;

    public GeneralSwitchFacade(){
        lights[0]=new Light("左前");
        lights[1]=new Light("右前");
        lights[2]=new Light("左后");
        lights[3]=new Light("右后");

        fan=new Fan();
        airConditioner=new AirConditioner();
        television=new Television();
    }

    public void on(){
        int len=lights.length;
        for(int i=0;i<len;i++){
            lights[i].on();
        }
        fan.on();
        airConditioner.on();
        television.on();
    }

    public void off(){
        int len=lights.length;
        for(int i=0;i<len;i++){
            lights[i].off();
        }
        fan.off();
        airConditioner.off();
        television.off();

    }
}

测试类

public class TestFacadePattern01 {

    public static void main(String[] args) {
        GeneralSwitchFacade generalSwitchFacade=new GeneralSwitchFacade();
        generalSwitchFacade.on();
        System.out.println("============");
        generalSwitchFacade.off();
    }
}

运行结果:
左前灯打开!
右前灯打开!
左后灯打开!
右后灯打开!
风扇打开
空调打开
电视打开
============
左前灯关闭!
右前灯关闭!
左后灯关闭!
右后灯关闭!
风扇关闭
空调关闭
电视关闭