Fachada Padrão de Fachada
Cena de simulação
Tem Client
um, que precisa ser regularizado na cidade, e o cadastro do domicílio precisa ser transferido, agora os órgãos competentes exigem Client
a preparação de uma série de materiais.
Vamos simplificar o departamento, supondo que precisamos apenas executar 材料部门
, 核验盖章部门
e 制证发证部门
três departamentos.
Agora você precisa Client
primeiro 材料部门
obter os materiais, depois preenchê-los e, por fim, obter o certificado 核验部门盖章
com os materiais cobertos , para que o negócio possa ser contado como concluído quando o conjunto estiver concluído em ordem.制证部门
simulação de código
Departamento de Materiais
/**
* 材料部门,给办证者提供必要的材料
* @author 行百里者
*/
public class StuffDept {
public void makeStuff() {
//处理业务逻辑
System.out.println("制作相关材料,并发给Client填写");
}
}
Departamento de Selos
/**
* 检查核验部门,核验通过才给盖章
* @author 行百里者
*/
public class CheckDept {
public void checkStuff() {
//处理业务逻辑
System.out.println("核查材料的准确性,核查通过才给盖章");
}
}
Departamento de Certificação
/**
* 发证部门
* @author 行百里者
*/
public class IssueDept {
public void issueCert() {
//处理业务逻辑
System.out.println("发证部门检验材料是否盖章,然后制证发证");
}
}
Client
Cenários de processamento que exigem certificação :
public class Client {
public static void main(String[] args) {
//一定要按照这个顺序去办证,否则拿不到证
StuffDept sd = new StuffDept();
sd.makeStuff();
CheckDept cd = new CheckDept();
cd.checkStuff();
IssueDept id = new IssueDept();
id.issueCert();
}
}
Na verdade, na vida real, podemos administrar muito mais do que esses três departamentos. Se nos deslocarmos Client
entre N departamentos, a eficiência do trabalho não é muito ruim!
Resolva este problema difícil com o modo de fachada
Felizmente, muitos lugares agora oferecem canais on-line para lidar com alguns negócios. Client
Você só precisa executar uma vez e Client
só precisa lidar com 网上通道
- .NetApp
/**
* “中国式办证”所需的“门面”部门,负责统一处理各部门的事情,
* Client只需要调“门面”的doItJustOnce方法即可
* @author 行百里者
*/
public class NetApp {
private StuffDept stuffDept = new StuffDept();
private CheckDept checkDept = new CheckDept();
private IssueDept issueDept = new IssueDept();
public void doItJustOnce() {
stuffDept.makeStuff();
checkDept.checkStuff();
issueDept.issueCert();
}
}
Client
ligar
public class Client {
public static void main(String[] args) {
NetApp facade = new NetApp();
facade.doItJustOnce();
}
}
Para Client
, não é refrescante!
Isso não é apenas mais uma camada de encapsulamento? Isso mesmo, este é o padrão de fachada , que resolve o Client
tedioso problema de fazer chamadas para vários departamentos e chamá-los na ordem especificada.
Fachada Deja Vu
API de pagamento Alipay
A parte de acesso só precisa chamar, não importa como seja implementado internamente, ele só precisa trocar dados de acordo com sua API aberta.
A API aberta do Alipay pode ser entendida como uma aplicação do modelo Fachada.
estrutura de registro SLF4J
A estrutura de log SLF4J adota o padrão de design de fachada, que oculta a complexidade do sistema do lado de fora e fornece uma interface unificada para o cliente ou programa chamado externamente.
private static final Logger LOGGER = LoggerFactory.getLogger(Provider.class);
public String doSomething() {
LOGGER.info("service name:{}", serviceName);
}
一句话就可以直接输出日志信息,而不管其内部是Log4j实现的还是logback实现的,用起来就是简单明了。
JDBC数据库操作
数据库JDBC的操作,例如:
@Component
public class DBUtil {
private static String URL;
private static String DRIVER;
private static String USERNAME;
private static String PASSWORD;
private static Connection connection = null;
private static final Logger LOGGER = LoggerFactory.getLogger(DBUtil.class);
/**
* 获取JDBC连接
*
*/
public static Connection getConnection() {
try {
//加载驱动程序:它通过反射创建一个driver对象。
Class.forName(DRIVER);
//获得数据连接对象。
connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
return connection;
} catch (Exception e) {
e.printStackTrace();
LOGGER.error("获取JDBC连接异常, {}", e.getMessage());
}
return null;
}
@Value("${db.dburl}")
public void setURL(String dburl) {
URL = dburl;
}
@Value("${db.dbdriver}")
public void setDRIVER(String dbdriver) {
DRIVER = dbdriver;
}
@Value("${db.dbusername}")
public void setUSERNAME(String dbusername) {
USERNAME = dbusername;
}
@Value("${db.dbpassword}")
public void setPASSWORD(String dbpassword) {
PASSWORD = dbpassword;
}
}
获取数据库连接的时候,只需要传入driver的驱动类名称即可,如果以后我们更换Class.forName中的 driver 非常方便,比如从MySQL数据库换到Oracle数据库,只要更换facade中的driver就可以。
Mediator 调停者模式
有的地方把它叫做中介者模式
,名字不重要!!!
张三的烦恼
张三的老婆发现他最近有点异常,怀疑张三和他前女友藕断丝连,于是张老婆去找张三他妈评理,但是俩人很快吵起来了,此时小姑子出现了,又是一顿吵,是互相吵的那种。
张三恼了,和其他三人也吵起来了。
他很想结束现状,但是他已无能为力,甚至自己也陷入其中,要是居委会大妈
在就好了!!!
居委会大妈
的职责就是协调他们内部的事情,有什么事直接跟我说,保证把你们的事情都解决!!!
居委会大妈
就是调停者,中介者。
模拟现场
加入了一个中介者作为四个模块的交流核心,每个模块之间不再相互交流,要交流就通过中介者居委会大妈
进行。每个模块只负责自己的业务逻辑,不属于自己的则丢给中介者来处理,简化了各模块之间的耦合关系。
消息中间件
卧槽,中介处理各个模块的需求,而且各个模块之间不需要通信,消息中间件不就是这种模式吗?
对!MQ就可以理解为Mediator模式
。
调停者模式的优缺点
- 优点
中介者模式的优点就是减少类间的依赖,把原有的一对多的依赖变成了一对一的依赖,减少了依赖,当然同时也降低了类间的耦合。
- 缺点
中介者模式的缺点就是中介者会膨胀得很大,而且逻辑复杂,,中介者的逻辑就越复杂。
好了,你已经会门面模式
和调停者模式
了。下一个!!!
- 我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿。