设计模式:Facate--外观模式

外观模式

 

外观模式是为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度,该模式中没有涉及到接口,看下类图:(我们以一个计算机的启动过程为例)

 

代码如下:

class CPU {

    public void startUp () {
        System.out.println("cpu startup");
    }

    public void shutdown() {
        System.out.println("cpu shotdown");
    }
}

class Disk {
    public void startUp () {
        System.out.println("disk startup");
    }

    public void shutdown() {
        System.out.println("disk shotdown");
    }
}


class Memory {
    public void startUp () {
        System.out.println("memory startup");
    }

    public void shutdown() {
        System.out.println("memory shotdown");
    }
}

class Computer {
    private CPU cpu;
    private Memory memory;
    private Disk disk;

    public Computer() {
        this.cpu = new CPU();
        this.memory = new Memory();
        this.disk = new Disk();
    }

    public void startUp() {
        System.out.println("start the computer!");
        cpu.startUp();
        memory.startUp();
        disk.startUp();
        System.out.println("start computer finished!");
    }

    public void shutdown(){
        System.out.println("begin to close the computer!");
        cpu.shutdown();
        memory.shutdown();
        disk.shutdown();
        System.out.println("computer closed!");
    }
}

public class MainClass {
    public static void main(String[] args) {
        Computer computer = new Computer();
        computer.shutdown();
        computer.startUp();
    }
}

如果我们没有Computer类,那么,CPU、Memory、Disk他们之间将会相互持有实例,产生关系,这样会造成严重的依赖,修改一个类,可能会带来其他类的修改,这不是我们想要看到的,有了Computer类,他们之间的关系被放在了Computer类里,这样就起到了解耦的作用,这,就是外观模式!

输出测试结果:

begin to close the computer!
cpu shotdown
memory shotdown
disk shotdown
computer closed!
start the computer!
cpu startup
memory startup
disk startup
start computer finished!

二、事例

各个类

public class Popcorn {

    private static Popcorn popcorn = new Popcorn();

    private Popcorn() {
    }

    public static Popcorn getInstance() {
        return popcorn;
    }

    public void on() {
        System.out.println("爆米花 启动");
    }

    public void off() {
        System.out.println("爆米花 关闭");
    }

    public void pop() {
        System.out.println("爆米花 可以吃了");
    }
}

public class Screen {

    private static Screen screen = new Screen();

    private Screen() {

    }

    public static Screen getInstance() {
        return screen;
    }

    public void up() {
        System.out.println("屏幕拉上去");
    }

    public void down() {
        System.out.println("屏幕拉下来");
    }
}


public class Projector {

    private static Projector projector = new Projector();

    private Projector() {
    }

    public static Projector getInstance() {
        return projector;
    }

    public void on() {
        System.out.println("投影仪 启动");
    }

    public void off() {
        System.out.println("投影仪 停止");
    }

    public void focus() {
        System.out.println("投影仪 暂停");
    }
}


public class Stereo {

    private static Stereo stereo = new Stereo();

    private Stereo() {

    }

    public static Stereo getInstance() {
        return stereo;
    }

    public void up() {
        System.out.println("音响调高声音");
    }

    public void down() {
        System.out.println("音响调低声音");
    }

    public void on() {
        System.out.println("音响启动");
    }

    public void off() {
        System.out.println("音响关闭");
    }
}


public class DvDPlayer {

    private static DvDPlayer dvDPlayer = new DvDPlayer();

    private DvDPlayer() {
    }

    public static DvDPlayer getInstance() {
        return dvDPlayer;
    }

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

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

    public void play() {
        System.out.println("dvd 播放中");
    }

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


public class TheaterLights {
    private static TheaterLights theaterLights = new TheaterLights();

    private TheaterLights() {

    }

    public static TheaterLights getInstance() {
        return theaterLights;
    }

    public void dim() {
        System.out.println("灯光昏暗");
    }


    public void on() {
        System.out.println("灯光启动");
    }

    public void off() {
        System.out.println("灯光关闭");
    }

    public void bright() {
        System.out.println("灯光调亮");
    }
}

外观类

public class HomeTheaterFacade {

    // 定义各个对
    private Popcorn popcorn; // 爆米花
    private Screen screen;// 屏幕
    private Projector projector; // 投影仪
    private Stereo stereo;// 音响
    private DvDPlayer dvDPlayer; // dvd
    private TheaterLights theaterLights; // 灯光

    public HomeTheaterFacade() {
        theaterLights = TheaterLights.getInstance();
        popcorn = Popcorn.getInstance();
        stereo = Stereo.getInstance();
        screen = Screen.getInstance();
        projector = Projector.getInstance();
        dvDPlayer = DvDPlayer.getInstance();
    }

    public void ready() {
        popcorn.on();
        popcorn.pop();
        screen.down();
        projector.on();
        stereo.on();
        dvDPlayer.on();
        theaterLights.on();
        theaterLights.dim();
    }

    public void paly(){
        dvDPlayer.pause();
    }

    public void off() {
        popcorn.off();
        theaterLights.bright();
        screen.up();
        projector.off();
        stereo.off();
        dvDPlayer.on();
    }
}

输出

public class MainClient {

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

        System.out.println("-----------");

        homeTheaterFacade.paly();

        System.out.println("------------");

        homeTheaterFacade.off();
    }
}

爆米花 启动
爆米花 可以吃了
屏幕拉下来
投影仪 启动
音响启动
dvd 启动
灯光启动
灯光昏暗
-----------
dvd 暂停
------------
爆米花 关闭
灯光调亮
屏幕拉上去
投影仪 停止
音响关闭
dvd 启动

Process finished with exit code 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值