java 23种常用设计模式之外观模式(Facade)

         在软件开发系统中,client程序经常要与复杂系统的内部子系统之间产生耦合,而导致client程序随着子系统的变化而变化。那么问题来了!如何简化client程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦?

         外观模式为子系统中的一组接口提供一个统一的高层接口,解决类与类之间的依赖关系。这一接口使得子系统更加容易使用,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度,该模式中没有涉及到接口,这里我就不编故事了,直接来看一个最经典的例子,计算机的启动过程。

java 23种常用设计模式之外观模式(Facade)_第1张图片

没有故事写不下去了,还是来个小故事娱乐一下这个类图吧!

有天有个老黑(User),觉得很无聊,于是打算自己组装个Computer,费了九牛二虎之力,在我cover机箱(facade)之前能不能先试试这个computer能不能打开呢?

于是他先后startup了CPU、Memory、Disk……成功街上显示屏玩了会植物大战僵尸,这样一块一块的这是玩的不爽,就逐个shutdown。还是用Facade先cover成一个完整的Computer,这样老黑就不需要这么麻烦了,直接startup Computer就直接帮老黑把CPU、Memory、Disk……这些启动了!要关机(shutdown)就直接把CPU之类的shutdown了!CPU、Memory、Disk这些类相对独立,在computer类中进行配置,高效的解决类与类之间的依赖关系。

详细代码如下:

package com.freedom.facade;

public class CPU {
	
	public void startup(){
		System.out.println("CPU start");
	}
	
	public void shutdown(){
		System.out.println("CPU shutdown");
	}

}
package com.freedom.facade;

public class Memory {
    
    public void startup(){
        System.out.println("menory start");
    }
    
    public void shutdown(){
        System.out.println("menory shutdown");
    }

}
package com.freedom.facade;

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

}
package com.freedom.facade;

public class Computer {
    
    private CPU cpu;
    private Memory memory;
    private Disk disk;
    
    public Computer(){
        cpu = new CPU();
        memory = new Memory();
        disk = new Disk();
    }
    
    public void startup(){
        System.out.println("computer start");
        cpu.startup();
        memory.startup();
        disk.startup();
    }
    
    public void shutdown(){
        System.out.println("computer shutdown");
        cpu.shutdown();
        memory.shutdown();
        disk.shutdown();
    }

}

package com.freedom.facade;

public class User {

    public static void main(String[] args) {

        Computer computer = new Computer();
        computer.startup();
        computer.shutdown();
    }

}

/*
运行结果:
computer start
CPU start
menory start
disk start
computer shutdown
CPU shutdown
menory shutdown
disk shutdown
*/

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

小结:
    从客户程序的角度来看,Facade模式不仅简化了整个组件系统的接口,同时对于组件内部与外部客户程序来说,从某种程度上也达到了一种“解耦”的效果----内部子系统的任何变化不会影响到Facade接口的变化。
    Facade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Facdae很多时候更是一种架构设计模式。

注意区分Facade模式、Adapter模式、Bridge模式与Decorator模式:

Facade模式注重简化接口,Adapter模式注重转换接口,Bridge模式注重分离接口(抽象)与其实现,Decorator模式注重稳定接口的前提下为对象扩展功能。 

下载源码:http://download.csdn.net/detail/github_22022001/8328447


你可能感兴趣的:(java 23种常用设计模式之外观模式(Facade))