Head First设计模式(8):外观模式

更多的可以参考我的博客,也在陆续更新ing
http://www.hspweb.cn/

外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

装饰者模式---不改变接口,但加入责任。
适配者模式---将一个接口转成另一个接口
外观模式---让接口更简单。

下面用书本例子:甜蜜的家庭影院说明。
观看电影流程:
1. 打开爆米花机
2. 开始爆米花
3. 将灯光调暗
4. 放下屏幕
5. 打开投影机
6. 将投影机的输入切换到DVD
7. 将投影机设置在宽屏模式
8. 打开功放
9. 将功放的输入设置为DVD
10. 将功放设置为环绕立体声
11. 将功放音量调中(5)
12. 打开DVD播放器
13. 开始播放DVD

1、目录
image
2、package cd

①CdPlayer.java

package cd;
import sounds.Amplifier;

public class CdPlayer {
    String description;
    int currentTrack;
    Amplifier amplifier;
    String title;

    public CdPlayer(String description, Amplifier amplifier) {
        this.description = description;
        this.amplifier = amplifier;
    }

    public void on() {
        System.out.println(description + " 开");
    }

    public void off() {
        System.out.println(description + " 关");
    }

    public void eject() {
        title = null;
        System.out.println(description + " 弹出");
    }

    public void play(String title) {
        this.title = title;
        currentTrack = 0;
        System.out.println(description + " 播放 \"" + title + "\"");
    }

    public void play(int track) {
        if (title == null) {
            System.out.println(description + " 不能播放轨道 " + currentTrack + 
                    ", 没有放入CD");
        } else {
            currentTrack = track;
            System.out.println(description + " 播放轨道 " + currentTrack);
        }
    }

    public void stop() {
        currentTrack = 0;
        System.out.println(description + " 停止");
    }

    public void pause() {
        System.out.println(description + " 暂停 \"" + title + "\"");
    }

    public String toString() {
        return description;
    }
}

3、package dvd

①DvdPlayer.java

package dvd;
import sounds.Amplifier;

public class DvdPlayer {
    String description;
    int currentTrack;
    Amplifier amplifier;
    String movie;

    public DvdPlayer(String description, Amplifier amplifier) {
        this.description = description;
        this.amplifier = amplifier;
    }

    public void on() {
        System.out.println(description + " 开");
    }

    public void off() {
        System.out.println(description + " 关");
    }

        public void eject() {
        movie = null;
                System.out.println(description + " 弹出");
        }

    public void play(String movie) {
        this.movie = movie;
        currentTrack = 0;
        System.out.println(description + " 播放 \"" + movie + "\"");
    }

    public void play(int track) {
        if (movie == null) {
            System.out.println(description + " 不能播放轨道 " + track + " 没有放入DVD");
        } else {
            currentTrack = track;
            System.out.println(description + " 播放轨道 " + currentTrack + " of \"" + movie + "\"");
        }
    }

    public void stop() {
        currentTrack = 0;
        System.out.println(description + " 停止 \"" + movie + "\"");
    }

    public void pause() {
        System.out.println(description + " 暂停 \"" + movie + "\"");
    }

    public void setTwoChannelAudio() {
        System.out.println(description + " 设置两个通道的音频");
    }

    public void setSurroundAudio() {
        System.out.println(description + " 设置环绕音频");
    }

    public String toString() {
        return description;
    }
}

4、package facade

①HomeTheaterFacade.java

package facade;
import cd.CdPlayer;
import dvd.DvdPlayer;
import light.TheaterLights;
import popcorn.PopcornPopper;
import projector.Projector;
import projector.Screen;
import sounds.Amplifier;
import sounds.Tuner;

public class HomeTheaterFacade {
    Amplifier amp;
    Tuner tuner;
    DvdPlayer dvd;
    CdPlayer cd;
    Projector projector;
    TheaterLights lights;
    Screen screen;
    PopcornPopper popper;

    public HomeTheaterFacade(Amplifier amp, 
                 Tuner tuner, 
                 DvdPlayer dvd, 
                 CdPlayer cd, 
                 Projector projector, 
                 Screen screen,
                 TheaterLights lights,
                 PopcornPopper popper) {

        this.amp = amp;
        this.tuner = tuner;
        this.dvd = dvd;
        this.cd = cd;
        this.projector = projector;
        this.screen = screen;
        this.lights = lights;
        this.popper = popper;
    }

    public void watchMovie(String movie) {
        System.out.println("准备开始看电影...");
        popper.on();
        popper.pop();
        lights.dim(10);
        screen.down();
        projector.on();
        projector.wideScreenMode();
        amp.on();
        amp.setDvd(dvd);
        amp.setSurroundSound();
        amp.setVolume(5);
        dvd.on();
        dvd.play(movie);
    }

    public void endMovie() {
        System.out.println("关闭电影...");
        popper.off();
        lights.on();
        screen.up();
        projector.off();
        amp.off();
        dvd.stop();
        dvd.eject();
        dvd.off();
    }

    public void listenToCd(String cdTitle) {
        System.out.println("准备享受听觉盛宴...");
        lights.on();
        amp.on();
        amp.setVolume(5);
        amp.setCd(cd);
        amp.setStereoSound();
        cd.on();
        cd.play(cdTitle);
    }

    public void endCd() {
        System.out.println("关闭 CD...");
        amp.off();
        amp.setCd(cd);
        cd.eject();
        cd.off();
    }

    public void listenToRadio(double frequency) {
        System.out.println("调音量...");
        tuner.on();
        tuner.setFrequency(frequency);
        amp.on();
        amp.setVolume(5);
        amp.setTuner(tuner);
    }

    public void endRadio() {
        System.out.println("关闭音量...");
        tuner.off();
        amp.off();
    }
}

5、package light

①TheaterLights.java

package light;

public class TheaterLights {
    String description;

    public TheaterLights(String description) {
        this.description = description;
    }

    public void on() {
        System.out.println(description + " 开");
    }

    public void off() {
        System.out.println(description + " 关");
    }

    public void dim(int level) {
        System.out.println(description + " 灯光亮度调到 " + level  + "%");
    }

        public String toString() {
                return description;
        }
}

6、package popcorn

①PopcornPopper.java

package popcorn;

public class PopcornPopper {
    String description;

    public PopcornPopper(String description) {
        this.description = description;
    }

    public void on() {
        System.out.println(description + " 开");
    }

    public void off() {
        System.out.println(description + " 关");
    }

    public void pop() {
        System.out.println(description + " 做爆米花!");
    }

        public String toString() {
                return description;
        }
}

7、package projector

①Projector.java

package projector;
import dvd.DvdPlayer;

public class Projector {
    String description;
    DvdPlayer dvdPlayer;

    public Projector(String description, DvdPlayer dvdPlayer) {
        this.description = description;
        this.dvdPlayer = dvdPlayer;
    }

    public void on() {
        System.out.println(description + " 开");
    }

    public void off() {
        System.out.println(description + " 关");
    }

    public void wideScreenMode() {
        System.out.println(description + " 宽屏模式(16x9纵横比)");
    }

    public void tvMode() {
        System.out.println(description + " 在电视模式中(4x3横纵比)");
    }

        public String toString() {
                return description;
        }
}

②Screen.java

package projector;

public class Screen {
    String description;

    public Screen(String description) {
        this.description = description;
    }

    public void up() {
        System.out.println(description + " 上升");
    }

    public void down() {
        System.out.println(description + " 下降");
    }

        public String toString() {
                return description;
        }
}

8、package sounds

①Amplifier.java

package sounds;
import cd.CdPlayer;
import dvd.DvdPlayer;

public class Amplifier {
    String description;
    Tuner tuner;
    DvdPlayer dvd;
    CdPlayer cd;

    public Amplifier(String description) {
        this.description = description;
    }

    public void on() {
        System.out.println(description + " 开");
    }

    public void off() {
        System.out.println(description + " 关");
    }

    public void setStereoSound() {
        System.out.println(description + " 立体模式打开");
    }

    public void setSurroundSound() {
        System.out.println(description + " 环绕立体声(5扬声器,1低音炮)");
    }

    public void setVolume(int level) {
        System.out.println(description + " 设置音量为 " + level);
    }

    public void setTuner(Tuner tuner) {
        System.out.println(description + " 设置Tuner " + dvd);
        this.tuner = tuner;
    }

    public void setDvd(DvdPlayer dvd) {
        System.out.println(description + " 设置DVD播放器 " + dvd);
        this.dvd = dvd;
    }

    public void setCd(CdPlayer cd) {
        System.out.println(description + " 设置CD播放器 " + cd);
        this.cd = cd;
    }

    public String toString() {
        return description;
    }
}

②Tuner.java

package sounds;

public class Tuner {
    String description;
    Amplifier amplifier;
    double frequency;

    public Tuner(String description, Amplifier amplifier) {
        this.description = description;
    }

    public void on() {
        System.out.println(description + " 开");
    }

    public void off() {
        System.out.println(description + " 关");
    }

    public void setFrequency(double frequency) {
        System.out.println(description + " 设置频率为 " + frequency);
        this.frequency = frequency;
    }

    public void setAm() {
        System.out.println(description + " 设置为上午模式");
    }

    public void setFm() {
        System.out.println(description + " 设置为下午模式");
    }

        public String toString() {
                return description;
        }
}

9、package test

①test.java

package test;

import cd.CdPlayer;
import dvd.DvdPlayer;
import facade.HomeTheaterFacade;
import light.TheaterLights;
import popcorn.PopcornPopper;
import projector.Projector;
import projector.Screen;
import sounds.Amplifier;
import sounds.Tuner;

//test
public class test {
    public static void main(String[] args) {
        Amplifier amp = new Amplifier("扩音器");   
        Tuner tuner = new Tuner("调频调谐器", amp);
        DvdPlayer dvd = new DvdPlayer("DVD播放器", amp);
        CdPlayer cd = new CdPlayer("CD播放器", amp);
        Projector projector = new Projector("投影仪", dvd);
        TheaterLights lights = new TheaterLights("家庭影院顶灯");
        Screen screen = new Screen("家庭影院屏幕");
        PopcornPopper popper = new PopcornPopper("爆玉米花机");

        HomeTheaterFacade homeTheater = 
                new HomeTheaterFacade(amp, tuner, dvd, cd, 
                        projector, screen, lights, popper);

        homeTheater.watchMovie("《夺宝奇兵》");
        homeTheater.endMovie();
    }
}

补充类图
image
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容

  • (老树) 人世了无趣,何事挂心头? 此身当时在,江河亘古流。 (毛毛) 江河亘古流,俗世本烦忧。 弄花赏明月,深山...
    sujing123阅读 669评论 5 5
  • 喝醉酒的女人 把自己扔进一片森林 一个人的双人床 辗转一个小时 反侧一个小时 打开笼子一个小时 锁住它一个小时 在...
    妖妖z阅读 780评论 36 19
  • 你装模作样 你自导自演 你自我陶醉 你疯癫懵懂 这虚构的世界 是想象到不了的边界 拥有就已经失去 有用早注定无用 ...
    四月暖阳01阅读 242评论 0 0
  • 今天和一个客户聊天,特有的有磁性声音,不自觉地透露出“我太太是拍广告的”信息, 感觉他是那么对自觉的妻子满意,自豪...
    Ida_Zheng阅读 273评论 0 0
  • 闺蜜在广西南宁读书,我算是在家乡读书,虽然相距千里,但在通讯相当发达的今天,常联系也不是什么难事。我们近八年的友情...
    MeetingTian阅读 616评论 11 11