【门面模式】
也称为 外观模式。
要求一个子系统的外部与内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。
门面模式注重“统一的对象”,也就是提供一个访问子系统的接口,除了这个接口不允许有任何访问子系统的行为发生。(即领导想了解项目完成的情况,只能通过项目经理,无需去询问底层的程序员、美工、产品经理之类的)。
门面模式主要有两部分组成:
* Facade门面角色
客户端可以调用这个角色的方法。此角色知道所有子系统的所有功能和职责。一般情况下,本角色会将所有客户端发来的请求委派到对应的子系统去,也就是说该角色没有实际的业务逻辑,只是一个委托类。
* subSystem子系统角色
可以同时有一个或多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。子系统并不知道门面的存在。相对于子系统而言,门面角色知识另外一个客户端而已。
【门面模式 例子】
package com.Higgin.Facade; /** * 产品经理 */ class ProductManager{ //设计产品 public void designProduct(){ System.out.println("产品经理:设计产品..."); } } /** * 程序员 */ class Programmer{ //写程序 public void writeProgarmm(){ System.out.println("程序员:写程序..."); } } /** * 美工 */ class ArtDesigner{ public void designArt(){ System.out.println("美工:设计网页..."); } } /** * 项目经理 * 管理者 产品经理、程序员、美工 */ class ProjectManager{ private ProductManager productManager=new ProductManager(); private Programmer programmer=new Programmer(); private ArtDesigner artDesigner=new ArtDesigner(); //项目经理协调工作 public void work(){ productManager.designProduct(); programmer.writeProgarmm(); artDesigner.designArt(); } } /** * 门面客户端 */ public class TestFacade { public static void main(String[] args) { ProjectManager projectManager=new ProjectManager(); projectManager.work(); } }
【运行结果】
【门面模式 优点】
* 减少系统的相互依赖
所有的依赖都是对门面对象的依赖,与子系统无关。
* 提高了系统的灵活性
依赖减少了,灵活性自然就提高了。不管子系统内部如何变化,只要不影响到门面对象,任你自由活动。
* 提高安全性
想让你访问子系统的哪些业务就开通哪些业务,不在门面上开通的方法则无法访问。
【门面模式 缺点】
不符合开闭原则,对修改关闭,对扩展开放。子系统有修改的情况,唯一能修改的就是门面角色的代码。
【门面模式 使用场景】
* 为一个复杂的模块或子系统提供一个共外界访问的接口。
* 子系统相对独立,外界对子系统的访问只要黑箱操作即可。
* 预防低水平人员带来的风险扩散
【门面模式 注意事项】
一般情况下,一个子系统主要有一个门面就够了。
下面情况可能会有多个门面:
* 门面已经庞大到不能忍受的地步
如果一个纯洁的门面对象已经超过了200行代码,虽然都是简单的委托操作,也建议拆成多个门面,否则会带来维护和扩展的麻烦。如何拆分呢?按照功能拆分是非常好的原则:如一个操作数据库的门面类可以拆分成:查询门面类、删除门面类、更新门面类。
* 子系统可以提供不同的访问路径
ClassA、ClassB、ClassC是一个子系统中的3对独享,现在有两个不用的高层模块想要访问该子系统,模块一可以完整地访问所有业务逻辑,也就是代码中的Facade类,它是子系统的信任模块。二模块二可以是受限制访问对象,只能访问ClassB的methodB()方法。