外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。
这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。
外观模式包含如下角色:
• Facade: 外观角色
• SubSystem:子系统角色
示例为 公司的组建过程可谓很复杂,有很多事情需要做,如注册公司,银行开户、交税、招聘等等,可按外观模式进行代码架构实现。
定义外外观角色 统一门面入口
/**
* <p>
* 外观模式-门面角色-统一门面入口
* </p>
*
* @since 2022/3/21 16:25
*/
public class Facade {
public static Company openCompany(String name, String legalPerson) {
Company company = AdminOfIndustry.register(name, legalPerson);
Bank.openAccount(name);
Taxation.applyTaxCode(name);
return company;
}
}
定义各子系统角色类,处理复杂事情
/**
* <p>
* 子系统角色-公司注册
* </p>
*
* @since 2022/3/21 16:22
*/
public class AdminOfIndustry {
public static Company register(String name, String legalPerson) {
return new Company(name, legalPerson);
}
}
/**
* <p>
* 子系统角色-银行开户
* </p>
*
* @since 2022/3/21 16:23
*/
public class Bank {
private String name;
private String bankCard;
public Bank(String name, String bankCard) {
this.name = name;
this.bankCard = bankCard;
}
public static Bank openAccount(String name) {
return new Bank(name, IdUtil.simpleUUID());
}
}
/**
* <p>
* 子系统角色-交税
* </p>
*
* @since 2022/3/21 16:24
*/
public class Taxation {
private String name;
public Taxation(String name) {
this.name = name;
}
public static Taxation applyTaxCode(String name) {
return new Taxation(name);
}
}
业务实体对象类
/**
* <p>
* 子系统角色-业务实体
* </p>
*
* @since 2022/3/21 16:20
*/
@Data
public class Company {
private String name;
private String legalPerson;
public Company(String name, String legalPerson) {
this.name = name;
this.legalPerson = legalPerson;
}
}
测试类
/**
* <p>
* 外观模式-测试类
* </p>
*
* @since 2022/3/22 14:12
*/
public class Client {
public static void main(String[] args) {
Company company = Facade.openCompany("新世界公司", "新世界");
System.out.println(company.toString());
}
}