外观模式
外观模式是为了解决类与类之家的依赖关系的,像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