外观模式是一种结构型设计模式。在外观模式中,外观类中提供一个或者一组对外的接口。客户端对于复杂系统的访问是通过外观类的接口进行的,从而解除了客户端与复杂系统之间的耦合,隐藏了复杂系统内部的逻辑。
该设计模式主要解决客户端与复杂系统内部子系统的沟通成本高的问题,通过外观类,简化了沟通流程,降低沟通成本。
主要的应用场景有:1、医院的接待员(外观类)。通过接待员,可以实现挂号、缴费和取药等一系列的动作,化繁为简。2、电脑启动。通过按一下启动键就可以启动电脑,而不需要我们挨个的给硬盘、cpu和内存上电。其应用场景,抽象来说,就是存在一个总管或者接待员的角色,帮助我们更高效的进行某种行为或者操作。
2、案例 2.1、背景智能家居是一个比较火的领域。我们的屋子里边会配置电器(复杂系统),每种电器,比如日光灯,电视,空调,冰箱(子系统)等都具有自己的开关。借助智能家居的思想,我们可以在手机上安装一个app,通过app(外观类)控制如上这些电器的开启和关闭。
2.2、实现定义复杂系统和子系统
/**
* 电器抽象
*/
public interface appliance
{
void powerOn();
void powerOff();
}
public class AirConditioning implements appliance
{
@Override public void powerOn()
{
System.out.println("打开空调。");
}
@Override public void powerOff()
{
System.out.println("关闭空调。");
}
}
public class Lamp implements appliance
{
@Override public void powerOn()
{
System.out.println("打开台灯。");
}
@Override public void powerOff()
{
System.out.println("关闭台灯。");
}
}
public class Refrigerator implements appliance
{
@Override public void powerOn()
{
System.out.println("打开冰箱。");
}
@Override public void powerOff()
{
System.out.println("关闭冰箱。");
}
}
public class TV implements appliance
{
@Override public void powerOn()
{
System.out.println("打开电视。");
}
@Override public void powerOff()
{
System.out.println("关闭电视。");
}
}
定义外观类
外观类中形成统一的界面,包含子系统的所有对外功能,用于呈现给客户端使用。
public class App
{
private Lamp lamp;
private Refrigerator refrigerator;
private TV tv;
private AirConditioning airConditioning;
public App()
{
this.lamp = new Lamp();
this.refrigerator = new Refrigerator();
this.tv = new TV();
this.airConditioning = new AirConditioning();
}
public void powerOnAppliance()
{
this.airConditioning.powerOn();
this.lamp.powerOn();
this.refrigerator.powerOn();
this.tv.powerOn();
System.out.println("");
}
public void powerOffAppliance()
{
this.airConditioning.powerOff();
this.lamp.powerOff();
this.refrigerator.powerOff();
this.tv.powerOff();
System.out.println("");
}
public void powerOnLamp()
{
this.lamp.powerOn();
}
public void powerOffLamp()
{
this.lamp.powerOff();
}
}
验证程序
/**
* 验证
*/
public class Demo
{
public static void main(String[] args)
{
App app = new App();
app.powerOnLamp();
app.powerOnAppliance();
app.powerOffLamp();
}
}
运行结果
3、总结打开台灯。
打开空调。
打开台灯。
打开冰箱。
打开电视。关闭台灯。
Process finished with exit code 0
优点:将客户端与复杂系统解耦,简化了使用流程。
缺点:不引入抽象外观类的情况,违背了开闭原则。