也谈设计模式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呀。

原文地址:https://www.cnblogs.com/kakag/p/3142842.html