《HeadFirst设计模式(第二版)》第七章代码——外观模式

代码文件目录:
Subsystem:
Amplifier
java 复制代码
package Chapter7_AdapterAndFacadePattern.FacadePattern.Subsystem;

/**
 * @Author 竹心
 * @Date 2023/8/8
 **/

//扬声器
public class Amplifier {
    int volume = 0;//音量

    public void on(){
        System.out.println("The amplifier is on!");
    }

    public void off(){
        System.out.println("The amplifier is off!");
    }

    public void setStreamingPlayer(){
        System.out.println("The amplifier setting to streamingPlayer mode!");
    }

    public void setVolume(int volume) {
        System.out.println("The amplifier volume is set to 5!");
        this.volume = volume;
    }

    public void setSurroundSound(){
        System.out.println("The amplifier is set to SurroundSound mode");
    }

    @Override
    public String toString() {
        return "Amplifier{" +
                "volume=" + volume +
                '}';
    }
}
PopcornPopper
java 复制代码
package Chapter7_AdapterAndFacadePattern.FacadePattern.Subsystem;

/**
 * @Author 竹心
 * @Date 2023/8/8
 **/

public class PopcornPopper {
    public void on(){
        System.out.println("The popcorn popper is on!");
    }

    public void off(){
        System.out.println("The popcorn popper is off!");
    }

    public void pop(){
        System.out.println("The popcorn popper is popping!");
    }

    @Override
    public String toString() {
        return this.getClass().getSimpleName();
    }
}

Projector

java 复制代码
package Chapter7_AdapterAndFacadePattern.FacadePattern.Subsystem;

/**
 * @Author 竹心
 * @Date 2023/8/8
 **/

//投影仪
public class Projector {
    public void on(){
        System.out.println("The Projector is on!");
    }

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

    public void WideScreenMode(){
        System.out.println("The Projector is in WideScreenMode!");
    }

    @Override
    public String toString() {
        return this.getClass().getSimpleName();
    }
}

Screen

java 复制代码
package Chapter7_AdapterAndFacadePattern.FacadePattern.Subsystem;

/**
 * @Author 竹心
 * @Date 2023/8/8
 **/

public class Screen {
    public void up(){
        System.out.println("The screen going up!");
    }

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

    @Override
    public String toString() {
        return this.getClass().getSimpleName();
    }
}
StreamPlayer
java 复制代码
package Chapter7_AdapterAndFacadePattern.FacadePattern.Subsystem;

/**
 * @Author 竹心
 * @Date 2023/8/8
 **/

public class StreamPlayer {
    String movie;

    public void on(){
        System.out.println("The StreamPlayer is on!");
    }

    public void off(){
        System.out.println("The StreamPlayer is off!");
    }

    public void pause(){
        System.out.println("The StreamPlayer is pausing!");
    }

    public void play(String movie){
        this.movie= movie;
        System.out.println("The StreamPlayer is playing the "+this.movie);
    }

    public void stop(){
        System.out.println("The StreamPlayer stops!");
    }

    @Override
    public String toString() {
        return this.getClass().getSimpleName();
    }
}
TheaterLights
java 复制代码
package Chapter7_AdapterAndFacadePattern.FacadePattern.Subsystem;

/**
 * @Author 竹心
 * @Date 2023/8/8
 **/

public class TheaterLights {
    public void on(){
        System.out.println("The theater lights are on!");
    }

    public void off(){
        System.out.println("The theater lights are off!");
    }

    public void dim(){
        //这里偷懒不将灯的亮度设置为属性了
        System.out.println("The theater lights are dimming to 10%");
    }

    @Override
    public String toString() {
        return this.getClass().getSimpleName();
    }
}
HomeTheaterFacade
java 复制代码
package Chapter7_AdapterAndFacadePattern.FacadePattern;

import Chapter7_AdapterAndFacadePattern.FacadePattern.Subsystem.*;

/**
 * @Author 竹心
 * @Date 2023/8/8
 **/

public class HomeTheaterFacade {
    Amplifier amp;
    StreamPlayer player;
    Projector projector;
    TheaterLights lights;
    Screen screen;
    PopcornPopper popper;


    public HomeTheaterFacade(Amplifier amp,
                             StreamPlayer player,
                             Projector projector,
                             TheaterLights lights,
                             Screen screen,
                             PopcornPopper popper) {
        this.amp = amp;
        this.player = player;
        this.projector = projector;
        this.lights = lights;
        this.screen = screen;
        this.popper = popper;
    }

    public void watchMovie(String movie){
        System.out.println("Get ready to watch a movie!");
        this.popper.on();
        this.popper.pop();

        this.lights.on();
        this.lights.dim();

        this.screen.down();

        this.projector.on();
        this.projector.WideScreenMode();

        this.amp.on();
        this.amp.setStreamingPlayer();
        this.amp.setSurroundSound();
        this.amp.setVolume(5);

        this.player.on();
        this.player.play(movie);
        System.out.println("Now, enjoy the movie!\n\n");
    }

    public void endMovie(){
        System.out.println("Shutting movie theater down!");
        this.popper.off();
        this.player.stop();
        this.player.off();
        this.amp.off();
        this.projector.off();
        this.screen.up();
        this.lights.off();
    }
}
HomeTheaterTestDrive
java 复制代码
package Chapter7_AdapterAndFacadePattern.FacadePattern;

import Chapter7_AdapterAndFacadePattern.FacadePattern.Subsystem.*;

/**
 * @Author 竹心
 * @Date 2023/8/8
 **/

public class HomeTheaterTestDrive {
    public static void main(String[] args) {
        Amplifier amplifier = new Amplifier();
        StreamPlayer streamPlayer = new StreamPlayer();
        Projector projector = new Projector();
        PopcornPopper popper = new PopcornPopper();
        TheaterLights lights = new TheaterLights();
        Screen screen = new Screen();

        HomeTheaterFacade homeTheater = new HomeTheaterFacade(amplifier,
                streamPlayer,projector,lights,screen,popper);

        homeTheater.watchMovie("Titanic");

        homeTheater.endMovie();

    }
}
notes.txt
java 复制代码
外观模式:
    为子系统中的一组接口提供统一的接口。外观定义了一个更高级别的接口,使得子系统更容易被使用

    当用户类要通过调用一系列的组件类的接口来实现某个最终的目的的时候,可以将这些组件类的接口
    统合在一起,形成一个新的接口,然后客户直接调用该接口,实现解耦合。

最少知识原则:
    一个对象只调用这些方法:对象自身的、作为参数传给方法发对象的、该方法创建或者实例化的任何对象、
    对象的任何组件。

    比如:
        1. return this.car.start();  可以
        2. return this.car.engine.start(); 不可以

    优缺点:一方面减少耦合度,减低维护成本;另一方面会使得"包装者"类增加,造成复杂度和开发时间增加
        同时还会降低运行时的性能。
相关推荐
杨杨杨大侠2 小时前
都能接模型、RAG 和 MCP,Java Agent 框架到底差在哪?
java
Thinker QAQ3 小时前
并发编程(九):BlockingQueue 与 Channel——语言层的原子性、可见性与有序性
java·python·go·并发编程·channel·blockingqueue·message passing
霸道流氓气质5 小时前
RAG 可观测性与生产监控实战:四层遥测模型、五大仪表盘与 OpenTelemetry 全链路追踪的 Java 生产级实现
java·人工智能·python
AOI小白新手上路5 小时前
autodl常用的tar 打包下载(数据集)命令手册:逐段拆解与套用模板
java·大数据·数据库
dishugj6 小时前
系统架构风险点、敏感点和权衡点的概念和区分
java·开发语言
高晶6 小时前
ARM 嵌入式 Linux 系统启动流程实战指南
设计模式·程序员
苜蓿muxu7 小时前
常用代码命名规范
java
高晶7 小时前
BMS 通信开发实战:从 PMBus 协议到数据采集的完整指南
设计模式·程序员
geovindu7 小时前
rust:Memento Pattern(续)
开发语言·后端·设计模式·rust·行为模式·备忘录模