外观模式(Facade)----设计模式

外观模式(Facade)----设计模式

什么是外观模式呢?

以我们中常见的案例说明,当我们需要安装win10电脑系统时,不需要了解安装系统的每一部分细节,交给固定程序进行安装即可;当我们去医院看病时,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便;等等…

外观模式就是将事件内部具体的细节封装起来,使使用者能够更加方便地完成需求。

即通过定义一个一致的接口(界面类),用以屏蔽内部子系统的细节,使得调用端只需要跟这个接口发生调用,而无需关心这个子系统的内部细节。

外观模式的基本介绍

在这里插入图片描述

制造一个影院管理?

在这里插入图片描述

假如现在要制作一个影院管理项目,如果我们要求完成使用家庭影院的功能,一个个调用使用这些方法实在过于繁琐,结构混乱。

通常情况下,电影院只会提供电影播放的准备工作、开始播放、暂停播放、结束播放的工作,此时我们就可以使用外观模式实现这一效果。

实现代码

爆米花类

package com.design_patterns.facade;

/**
 * 定义爆米花机器类
 */
public class PopCorn {
    
    

    private static PopCorn instance = new PopCorn();

    private PopCorn(){
    
    };

    public static PopCorn getInstance(){
    
    
        return instance;
    }

    public void on(){
    
    
        System.out.println(" popcorn on ");
    }

    public void off(){
    
    
        System.out.println(" popcorn off ");
    }

    public void pop(){
    
    
        System.out.println(" popcorn pop ");
    }
}

DVD播放器类

package com.design_patterns.facade;

/**
 * 定义DVDPlayer播放类
 */
public class DVDPlayer {
    
    

    //使用单例模式(饿汉式)
    private static DVDPlayer instance = new DVDPlayer();

    //构造方法私有化
    private DVDPlayer(){
    
    };

    //获取单例模式对象
    public static DVDPlayer getInstance(){
    
    
        return instance;
    }

    public void on(){
    
    
        System.out.println(" dvd on ");
    }

    public void off(){
    
    
        System.out.println(" dvd off ");
    }

    public void play(){
    
    
        System.out.println(" dvd is playing ");
    }

    public void pause(){
    
    
        System.out.println(" dvd pause ");
    }
}

放映机类

package com.design_patterns.facade;

/**
 * 定义放映机类
 */
public class Projector {
    
    

    private static Projector instance = new Projector();

    private Projector(){
    
    };

    public static Projector getInstance(){
    
    
        return instance;
    }

    public void on(){
    
    
        System.out.println(" Projector on ");
    }

    public void off(){
    
    
        System.out.println(" Projector off ");
    }

    public void focus(){
    
    
        System.out.println(" Projector focus ");
    }


}

屏幕类(荧屏)

package com.design_patterns.facade;

/**
 * 定义屏幕
 */
public class Screen {
    
    
    //使用单例模式(饿汉式)
    private static Screen instance = new Screen();

    //构造方法私有化
    private Screen(){
    
    };

    //获取单例模式对象
    public static Screen getInstance(){
    
    
        return instance;
    }

    public void up(){
    
    
        System.out.println(" screen up ");
    }

    public void down(){
    
    
        System.out.println(" screen down ");
    }

}

音响类

package com.design_patterns.facade;

/**
 * 定义音箱,输出影片声音
 */
public class Stereo {
    
    
    //使用单例模式(饿汉式)
    private static Stereo instance = new Stereo();

    //构造方法私有化
    private Stereo(){
    
    };

    //获取单例模式对象
    public static Stereo getInstance(){
    
    
        return instance;
    }

    public void on(){
    
    
        System.out.println(" stereo on ");
    }

    public void off(){
    
    
        System.out.println(" stereo off ");
    }

    public void up(){
    
    
        System.out.println(" stereo up ");
    }

    public void down(){
    
    
        System.out.println(" stereo down ");
    }
}

影院灯光类

package com.design_patterns.facade;

/**
 * 定义电影院内的灯光类
 */
public class TheaterLight {
    
    
    //使用单例模式(饿汉式)
    private static TheaterLight instance = new TheaterLight();

    //构造方法私有化
    private TheaterLight(){
    
    };

    //获取单例模式对象
    public static TheaterLight getInstance(){
    
    
        return instance;
    }

    public void on(){
    
    
        System.out.println(" TheaterLight on ");
    }

    public void off(){
    
    
        System.out.println(" TheaterLight off ");
    }

    public void bright(){
    
    
        System.out.println(" TheaterLight bright ");
    }

    public void dim() {
    
    
        System.out.println(" TheaterLight dim ");
    }
}

电影院类,即外观模式的实现

package com.design_patterns.facade;

/**
 * 定义电影院类,通过方法封装各个子部分的实现细节
 */
public class HomeTheaterFacade {
    
    

    //定义各个子系统的对象
    private DVDPlayer dvdPlayer;
    private PopCorn popCorn;
    private Projector projector;
    private Screen screen;
    private Stereo stereo;
    private TheaterLight theaterLight;

    //通过构造方法为电影院各个子系统部分获取实例化对象
    public HomeTheaterFacade(){
    
    
        this.dvdPlayer = DVDPlayer.getInstance();
        this.popCorn = PopCorn.getInstance();
        this.projector = Projector.getInstance();
        this.screen = Screen.getInstance();
        this.stereo = Stereo.getInstance();
        this.theaterLight = TheaterLight.getInstance();
    }


    //操作分为 4 步

    /**
     * 进行准备工作
     */
    public void ready(){
    
    
        System.out.println("----- 电影院准备放映影片 -----");
        popCorn.on();
        popCorn.pop();
        screen.down();
        projector.on();
        stereo.on();
        dvdPlayer.on();
        theaterLight.dim();

    }

    /**
     * 电影院开始放电影工作
     */
    public void play(){
    
    
        System.out.println("----- 电影院开始放映影片 -----");
        dvdPlayer.play();
    }

    /**
     * 电影院进行暂停工作
     */
    public void pause(){
    
    
        System.out.println("----- 电影院暂停放映影片 -----");
        dvdPlayer.pause();
    }

    /**
     * 电影院电影放映结束动作
     */
    public void end(){
    
    
        System.out.println("----- 电影院结束放映影片 -----");
        popCorn.off();
        theaterLight.bright();
        screen.up();
        projector.off();
        stereo.off();
        dvdPlayer.off();
    }
}

客户端(测试)类

package com.design_patterns.facade;

public class Client {
    
    
    public static void main(String[] args) {
    
    
        HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade();

        homeTheaterFacade.ready();      //电影院准备工作
        homeTheaterFacade.play();       //电影院开始放电影
        homeTheaterFacade.pause();      //电影院暂停放电影
        homeTheaterFacade.end();        //电影院结束影片放映
    }
}

运行结果

----- 电影院准备放映影片 -----
 popcorn on 
 popcorn pop 
 screen down 
 Projector on 
 stereo on 
 dvd on 
 TheaterLight dim 
----- 电影院开始放映影片 -----
 dvd is playing 
----- 电影院暂停放映影片 -----
 dvd pause 
----- 电影院结束放映影片 -----
 popcorn off 
 TheaterLight bright 
 screen up 
 Projector off 
 stereo off 
 dvd off 

总结

嘻嘻,感觉外观模式非常容易理解,本质就是将事件的实现细节通过一个一致界面进行封装,最后调用封装实现功能即可,好啦,就到这里,加油~~~

猜你喜欢

转载自blog.csdn.net/weixin_43479947/article/details/107614468