外观模式也叫门面模式,英文是 facade。这是很常见的一种设计模式,它好比 JDK 中的 Socket 接口就应用了外观模式,参考:门面模式的典型应用 Socket 和 Http(post,get)、TCP/IP 协议的关系总结html
外观模式也很是简单,它提供了一个统一的对外的高层次接口,用来访问子系统中的一群接口,也是对象的结构型模式,它符合迪米特法则——最少知道原则,类比现实,好比政府的综合性办事大厅,就很是像 facade 模式。设计模式
闲言少叙,直接看代码,外观模式的代码很是好写,可是也很差写,简单是由于其没有特殊的组合、继承、或者抽象的地方,按照我我的理解,就是一种集中接口的思惟的体现,难在须要结合业务的实际状况。post
一个网上商城的最简单例子,在网上商城用钱买商品,也可使用积分兑换商品,有验证系统(好比资格验证,身份验证等),支付系统,物流系统等模块,若是客户端(业务方)每次使用,都要考虑这三个接口,不只各个子系统的 RD 维护复杂,也给业务方增长了使用负担,那么就适合使用 facade 模式,进行高层次的一个抽象。this
代码以下:Goods 表明商品类,Validate 服务,Distribute 配送服务,还有一个 payoff 支付服务,三个子系统由 facade 服务统一规划。url
public class Goods { private String name; public Goods(String name) { this.name = name; } public String getName() { return name; } } //////////////////////////////////// public class ValidateService { public boolean isOk(Goods goods) { System.out.println("验证:" + goods.getName() + "是否有资格兑换商品"); return true; } } //////////////////////////////////// public class PayoffService { public boolean payoff(Goods goods) { System.out.println("兑换:" + goods.getName() + " 成功"); return true; } } /////////////////////////////////// public class DistributionService { public void distribution(Goods goods) { System.out.println("生成订单,准备配送: " + goods.getName()); } } ////////////////////////////////// public class FacadeService { private ValidateService validateService; private PayoffService payoffService; private DistributionService distributionServicel; public void setValidateService(ValidateService validateService) { this.validateService = validateService; } public void setPayoffService(PayoffService payoffService) { this.payoffService = payoffService; } public void setDistributionServicel(DistributionService distributionServicel) { this.distributionServicel = distributionServicel; } public void pay(Goods goods) { if (this.validateService.isOk(goods)) { if (this.payoffService.payoff(goods)) { this.distributionServicel.distribution(goods); } } } }
简化了客户端调用spa
public class Main { public static void main(String[] args) { FacadeService facadeService = new FacadeService(); Goods goods = new Goods("哈哈皮鞋"); facadeService.setDistributionServicel(new DistributionService()); facadeService.setPayoffService(new PayoffService()); facadeService.setValidateService(new ValidateService()); facadeService.pay(goods); } }
效果以下:设计
好比上述案例,彻底能够把子系统单例化使用,固然实际业务中,可能 Spring 全家桶更多一些,service 类直接全局配成单例的对象。code
facade 可让很是复杂的系统,变的简单好用,好比只提供一个对外的统一门面,屏蔽内部系统的复杂API,本质就是让系统的对外接口变少htm
中介者模式是双向的进行管理和约束,外观模式是单向的管理和约束。具体参考:对象关系一对多转换为一对一的方案——中介者模式总结对象