门面模式的定义:
外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式。
门面模式优缺点?
优点:对内部复杂的调用提供统一的接口,降低系统与系统之间的耦合度。(说白了就是简化你的操作,同时不和一些功能模块关联在一起,你在自己的系统里直接调用别人的代码。)
缺点:在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。
代码实例:
(1)接口设计图如下
(二)简化一下
从图中我们可以看出,无论内部系统存在多么复杂的调用关系,对于客户端来说我们都不用去关心,我们只需要关心我们的门面接口给我们提供的入口即可,真正做到了:金玉其面,乱絮其中!
代码:
systemA:
import lombok.Builder;
@Builder
public class SystemA {
public Object doSthA1(Object ...obj){
//do sth. a1
return "a1";
}
public Object doSthA2(Object ... obj){
//do sth. a2
return "a2";
}
public Object doSthA3(Object ... obj){
// do sth. a3
return "a3";
}
}
systemB:
import lombok.Builder;
@Builder
public class SystemB {
public Object doSthB1(Object ...obj){
//to do sth. b1 system B must invoke system a
SystemA systemA =SystemA.builder().build();
systemA.doSthA1(obj);
//do sth. b1 ....
return "b1";
}
public Object doSthB2(Object ... obj){
//do sth. b2
return "b2";
}
public Object doSthB3(Object ... obj){
// do sth. b3
return "b3";
}
}
systemC:
import lombok.Builder;
@Builder
public class SystemC {
public Object doSthC1(Object ...obj){
// to do sth c2 the system C must invoke the system B
SystemB.builder().build().doSthB1(obj);
//do sth. c1 .....
return "c1";
}
public Object doSthC2(Object ... obj){
//do sth. c2
return "c2";
}
public Object doSthC3(Object ... obj){
// do sth. c3
return "c3";
}
}
facede:
import lombok.Builder;
@Builder
public class Facede {
public SystemA systemA;
public SystemB systemB;
public SystemC systemC;
public Object doSthFinally(Object ... obj){
systemA.doSthA2();
systemB.doSthB1();
systemC.doSthC1();
//and so on
return "sth. you want return...";
}
//and more methods you want provide
}
client:
// this is outerside system that want to get sth. from system A B C
class TestFacede{
public static void main(String[] args) {
Facede.builder().build().doSthFinally();
}
}