Facade Pattern

Facade Pattern
假设家里有一组家庭影院,包括:灯光,幻灯屏幕,扬声器, DVD 。如果我们想打开这些设备开始看电影,必须先进行如下操作:

关灯——放下屏幕——打开扬声器——打开DVD

实现如下:

package javaapplication35;

 

public class Main {

    public static void main(String[] args) {

        Light light=new Light();

        light.turnOff();

       

        Screen screen=new Screen();

        screen.down();

       

        Amplifier amplifier=new Amplifier();

        amplifier.On();

       

        Dvdplayer player=new Dvdplayer();

        player.On();

    }

}

 

class Light {

    public void turnOn() {

        System.out.println("Lights Turn On");

    }

    public void turnOff() {

        System.out.println("Lights Turn Off");

    }

}

 

class Screen {

    public void down() {

        System.out.println("Put the Screen Down");

    }

    public void up() {

        System.out.println("Put the Screen Up");

    }

}

 

class Amplifier {

    public void On() {

        System.out.println("Turn Sound Amplifier On");

    }

    public void Off() {

        System.out.println("Turn Sound Amplifier Off");

    }

}

 

class Dvdplayer {

    public void On() {

        System.out.println("Turn the DVD player On");

    }

    public void Off() {

        System.out.println("Turn the DVD player Off");

    }

}

 

可以看到,想看部电影,在客户端(主程序)要进行N多操作后才行。其实如果设备更多,比如说还要调整音频属性,切换DVD专属频道,打开空调等。每次我想看部电影,就要重复执行这些命令。

可不可执行一次命令就可以搞定一切呢?很简单,专门写个类,写个函数实现这一串命令就可以了。客户端到时候就只要调用这个新增的类中的函数即可。

 

把主函数的过程直接移去到另一个类的函数中:

public class Main {

    public static void main(String[] args) {

        (new TheaterFacade()).WatchDvd();

    }

}

 

class TheaterFacade {

    public void WatchDvd() {

        Light light = new Light();

        light.turnOff();

 

        Screen screen = new Screen();

        screen.down();

 

        Amplifier amplifier = new Amplifier();

        amplifier.On();

 

        Dvdplayer player = new Dvdplayer();

        player.On();

    }

}

 

这个就是最基本的Façade Pattern。前提条件是:当客户端要实现某个功能的时候,必须要调用一连串的类及其函数。

为了实现“一键”功能能,就在客户端和众多的类库(实现具体过程)中间,添加一个Façade类,类中的方法实现了各种不同的“一键功能”(一键打开家庭影院,一键关闭。。。)

这样做还有一个好处就是隔离了客户端和起具体实现作用的类库。

 

最后,上面的TheaterFacade类还可以写的更灵活点,因为上面的程序把实例化LightScreen等放到了具体的方法内部,这样当我想“关家庭影院”时,因为找不到具体对象就没法操作了。

把实例化放到具体方法外面,并添加一个构造函数,以便可以指定特定的播放仪器(比如家里有两个扬声器的时候?)

package javaapplication35;

 

public class Main {

    public static void main(String[] args) {

        Light light = new Light();

        Screen screen = new Screen();

        Amplifier amplifier = new Amplifier();

        Dvdplayer dvdplayer = new Dvdplayer();

        TheaterFacade facade = new TheaterFacade(light, screen, amplifier, dvdplayer);

        facade.WatchDvd();

        facade.CloseDvd();

    }

}

 

class TheaterFacade {

    Light light;

    Screen screen;

    Amplifier amplifier;

    Dvdplayer dvdplayer;

    TheaterFacade(Light light, Screen screen, Amplifier amplifier, Dvdplayer dvdplayer) {

        this.light = light;

        this.screen = screen;

        this.amplifier = amplifier;

        this.dvdplayer = dvdplayer;

    }

    public void WatchDvd() {

        light.turnOff();

        screen.down();

        amplifier.On();

        dvdplayer.On();

    }

    public void CloseDvd() {

        light.turnOn();

        screen.up();

        amplifier.Off();

        dvdplayer.Off();

    }

}

 

class Light {

    public void turnOn() {

        System.out.println("Lights Turn On");

    }

    public void turnOff() {

        System.out.println("Lights Turn Off");

    }

}

 

class Screen {

    public void down() {

        System.out.println("Put the Screen Down");

    }

    public void up() {

        System.out.println("Put the Screen Up");

    }

}

 

class Amplifier {

    public void On() {

        System.out.println("Turn Sound Amplifier On");

    }

    public void Off() {

        System.out.println("Turn Sound Amplifier Off");

    }

}

 

class Dvdplayer {

    public void On() {

        System.out.println("Turn the DVD player On");

    }

    public void Off() {

        System.out.println("Turn the DVD player Off");

    }

}

 

 

 

你可能感兴趣的:(Facade Pattern)