小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。
概述
外观模式,又称为门面模式,是结构型设计模式的一种。它能够为程序库或框架等一些相对复杂的类提供一个简单的接口,使得子系统更容易使用。
角色
子系统:可以同时有一个或多个子系统,每一个子系统都不是一个单独的类,而是一个类的集合。对于子系统而言,它不知道外观的存在,外观对它来说仅仅是另一个客户端而已。
外观:提供了给客户端访问子系统的接口,会将所有从客户端发来的请求委派到相应的子系统中,本身没有实际的业务逻辑。
模板
子系统:定义一个医院接口以及各个区域实现类。
/**
* 医院接口
*/
public interface Hospital {
void go();
}
/**
* 挂号处
*/
public class ReceptionArea implements Hospital{
@Override
public void go() {
System.out.println("到医院挂号处挂号");
}
}
/**
* 门诊部
*/
public class OutpatientDepartment implements Hospital{
@Override
public void go() {
System.out.println("到医院门诊部看病");
}
}
/**
* 收费处
*/
public class TollOffice implements Hospital{
@Override
public void go() {
System.out.println("到医院收费处付费");
}
}
/**
* 药房
*/
public class Pharmacy implements Hospital{
@Override
public void go() {
System.out.println("到医院药房取药");
}
}
外观:医院接待员,负责解答指引病人到对应区域。
/**
* 接待员
*/
public class Receptionist {
/**
* 挂号处
*/
private Hospital receptionArea;
/**
* 门诊部
*/
private Hospital outpatientDepartment;
/**
* 收费处
*/
private Hospital tollOffice;
/**
* 药房
*/
private Hospital pharmacy;
/**
* 做为医院的接待员,对内部业务都要熟悉
*/
public Receptionist() {
this.receptionArea = new ReceptionArea();
this.outpatientDepartment = new OutpatientDepartment();
this.tollOffice = new TollOffice();
this.pharmacy = new Pharmacy();
}
/**
* 医院看病流程
*/
public void medicalProcedures(){
goReceptionArea();
goOutpatientDepartment();
goTollOffice();
goPharmacy();
}
/**
* 去挂号处
*/
public void goReceptionArea(){
receptionArea.go();
}
/**
* 去门诊部
*/
public void goOutpatientDepartment(){
outpatientDepartment.go();
}
/**
* 去收费处
*/
public void goTollOffice(){
tollOffice.go();
}
/**
* 去药房
*/
public void goPharmacy(){
pharmacy.go();
}
}
客户端:使用外观类实现看病指引,由外观类去调用各个子系统指向业务逻辑。
public class FacadePattern {
public static void main(String[] args) {
// 创建一个接待员对象
Receptionist receptionist = new Receptionist();
// 询问接待员看病流程
receptionist.medicalProcedures();
System.out.println("===============================");
// 询问接待员取药问题
receptionist.goPharmacy();
// 询问接待员挂号问题
receptionist.goReceptionArea();
// 询问接待员付费问题
receptionist.goTollOffice();
// 询问接待员看病问题
receptionist.goOutpatientDepartment();
}
}
小结
优点
减少依赖:客户端请求均通过外观调用,不依赖多个子系统。
灵活:不管子系统内部如何变化,只要外观提高的接口不变,对于客户端来说均不会受到影响。
安全:外观类中没有提供的方法,外界就无法访问,有效提高系统安全性。
缺点
耦合性高:外观类可能会成为与程序中所有类都耦合的超级对象。
适用场景
- 可以为复杂的模块或子系统提供直接接口供外界访问。
- 使子系统相对独立,外界对于子系统的访问并不需要知道具体操作。
- 提高安全性,防止开发水平较低的人员误用复杂子系统功能导致问题发生。
最后
文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!!!
如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!