Java设计模式10:外观模式(Facade)

外观模式(Facade)

意图

为子系统中的一组接口提供一个一致的界面,facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用

适用性

1、为一个复杂的子系统提供一个简单的接口

2、客户程序与抽象类的实现部分之间存在着很大的依赖性,Facade模式将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性

3、需要构建一个层次结构的子系统时,Facade模式可以定义子系统中每层的入口点,且可以连接不同的子系统,简化子系统之间的依赖关系

结构

这里写图片描述

Facade

知道哪些子系统类负责处理请求

将客户的请求代理给适当的子系统对象

SUbsystem classes

实现子系统的功能

处理由Facade对象指派的任务

不持有指向Facade的指针

介绍

外观模式就像是一个管家,没有他,你的一天行程都有自己来办,买机票,出行,打车,准备材料等,有了这个Dacade,你可以把你的需求告诉他,它会将一系列的流程都走完,只需和管家一步流程就可以了,而不用事必躬亲(dog)0—0)。很明显,好处就是,客户的处理流程更加简单,当然你要想某一步骤自己来也是 可以的。

实现

假如小马同志之前没有管家时,下班回家之后一般要开灯,做饭,洗澡,然后看会电视。那么他要这样:

开灯

package facade;

/**
 * @Author fitz.bai
 * @Date 2018/8/30 16:51
 */
public class Light {
    public void open(){
        System.out.println("开灯");
    }
}

做饭

package facade;

/**
 * @Author fitz.bai
 * @Date 2018/8/30 16:51
 */
public class Cook {
    public void cook() {
        System.out.println("做饭");

    }
}

洗澡

package facade;

/**
 * @Author fitz.bai
 * @Date 2018/8/30 16:52
 */
public class TakeShower {
    public void open() {
        System.out.println("开热水器");

    }
}

看电视

package facade;

/**
 * @Author fitz.bai
 * @Date 2018/8/30 16:53
 */
public class TV {
    public void open() {
        System.out.println("开电视");

    }
}

回家后

package facade;

/**
 * @Author fitz.bai
 * @Date 2018/8/30 16:53
 */
public class GoHome {
    public static void main(String[] args) {
        Light light1 = new Light();
        Light light2 = new Light();
        Light light3 = new Light();
        Cook cook = new Cook();
        TakeShower takeShower = new TakeShower();
        TV tv = new TV();

        light1.open();
        light2.open();
        light3.open();
        cook.cook();
        takeShower.open();
        tv.open();

//        Facade facade = new Facade();
//        facade.open();
    }
}
/**
开灯
开灯
开灯
做饭
开热水器
开电视
*/

后来呢,小马有钱了,也忙了,于是请了一个管家

package facade;

/**
 * @Author fitz.bai
 * @Date 2018/8/30 17:00
 */
public class Facade {
    private Light light;
    private Cook cook;
    private TakeShower takeShower;
    private TV tv;

    public Facade() {
        light = new Light();
        cook = new Cook();
        takeShower = new TakeShower();
        tv = new TV();
    }

    public void open() {
        light.open();
        cook.cook();
        takeShower.open();
        tv.open();
    }
}

调用方法就在GoHome里面注释的部分,是否简单了许多,所以说外观模式是生活更加简单,科技使生活更美好!!!

优点

1、对客户屏蔽子系统组组件,简化接口,使客户使用子系统更加方便

2、实现了子系统和客户之间的松耦合关系

3、它不会限制使用子系统类

缺点

1、如果不引入抽象外观类,增加新的子系统可能需要修改外观类或客户端的源代码,违背“开闭原则”

2、不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性。

猜你喜欢

转载自blog.csdn.net/qq_22798455/article/details/82224586