也谈设计模式Facade
门面模式提供一个高层次的接口,使得子系统更容易使用。
子系统与外部系统的通信必须经过一个统一的facade进行处理。
内部系统的交互在facade中进行整合,这样,对于外部系统的使用者就不用关注内部系统的复杂性。而有facade的存在也降低了内外系统的耦合。
1.内部系统
1.1 内部子系统1--对茶的操作
package designPattern.facade; public class TeaDeal { public void getTea() { System.out.println("放茶...."); } public void cookTea() { System.out.println("煮茶...."); } }
1.2 内部子系统2--对水的操作
package designPattern.facade; public class WaterDeal { public void poulWater() { System.out.println("倒水...."); } public void boilWater() { System.out.println("烧水...."); } }
2.外部调用
这里面我们将泡茶的流程设定为:放茶→烧水→泡茶,不采用facade模式的时候,我们会这样做
package designPattern.facade; public class NoFacadeTest { public static void main(String[] args) { TeaDeal teaDeal = new TeaDeal(); WaterDeal waterDeal = new WaterDeal(); //泡茶 teaDeal.getTea(); waterDeal.boilWater(); waterDeal.poulWater(); } }
有了facade,我们会这样做
2.1 创建facade
package designPattern.facade; public class Facade { private TeaDeal teaDeal; private WaterDeal waterDeal; public Facade() { this.teaDeal = new TeaDeal(); this.waterDeal = new WaterDeal(); } public void cookTea(){ System.out.println("这是泡茶流程...."); teaDeal.getTea(); waterDeal.boilWater(); waterDeal.poulWater(); } public void boilTea(){ System.out.println("这是煮茶流程..."); teaDeal.getTea(); waterDeal.poulWater(); teaDeal.cookTea(); } }
2.2 外部调用
package designPattern.facade; public class FacadeTest { public static void main(String[] args) { Facade facade = new Facade(); facade.boilTea(); facade.cookTea(); } }
3.对比分析
在追MM和设计模式这篇神文中,对与facade的形象解释:
我有一个专业的Nikon相机,我就喜欢自己手动调光圈、快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也不会。幸好相机有Facade设计模式,把相机调整到自动档,只要对准目标按快门就行了,一切由相机自动调整,这样MM也可以用这个相机给我拍张照片了。
与上面的示例相对应的,facade提供的方法中也有自动档这个档位(泡茶),MM不用去关注怎么去烧水怎么去倒水,泡茶成了一键式,大大的方便了MM呀。