一、概念:
外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。
这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。
二、结构图如图所示:
三、代码实现
1、三个子系统类型
public class MoneySystem{
//收款
public void in(){
System.out.println("收款")
}
//退款
public void out(){
Sysotem.out.println("退款")
}
}
public class OrderSystem{
//收款
public void create(){
System.out.println("下达订单")
}
//退款
public void tui(){
Sysotem.out.println("订单退货")
}
}
public class StoreSystem{
//收款
public void ruku(){
System.out.println("入库")
}
//退款
public void chuku(){
Sysotem.out.println("出库")
}
}
2、创建一个外观接口实现三个子系统
public class Facade{
private MoneySystem moneySystem;
private OrderSystem orderSystem;
private StoreSystem storeSystem;
public Facade(){
this.moneySystem=new MoneySystem();
this.orderSystem=new OrderSystem();
this.storeSystem=new StoreSystem();
}
//下达订单流程
public void createOrder(){
orderSystem.create();
storeSystem.chuku();
moneySystem.in();
}
}
3、创建一个客户端测试一下
public class Test{
public static void main(String[] args){
//客户下订单
Facade facade=new Facade();
facade.createOrder();
}
}
测试结果:
下达订单
出库
收款
四、优缺点
优点:
1、实现了子系统与客户端之间的松耦合关系。
2、客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。
缺点:
1、不能更好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制减少了可变性和灵活性
2、在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的代码,违背了“开闭原则”