设计模式-外观模式(Facade)

外观模式又称为门面模式,为一组类似功能的集群,比如类库、子系统等,提供一致的入口供client调用

角色和职责:

1.门面(Facade)-Computer:

   外观模式的核心。它被客户角色调用,它熟悉子系统的功能。内部根据客户角色的需求预定了几种功能的组合

2.子系统(Packages)=CPU、Memory、Disk:

   实现了子系统的功能。它对客户角色和Facade时未知的。它内部可以有系统内的相互交互,也可以由供外界调用的接口

 

UML图:

 

具体源码:

/**
 * CPU
 */
public class CPU {
    /**
     * 启动CPU
     */
    public void startCpu(){
        System.out.println("启动CPU");
    }

    /**
     * 关闭CPU
     */
    public void shutdownCpu(){
        System.out.println("关闭CPU");
    }
}
/**
 * 内存条
 */
public class Memory {
    public void startMemory(){
        System.out.println("启动内存");
    }
    public void shutdownMemory(){
        System.out.println("关闭内存");
    }
}
/**
 * 桌面
 */
public class Disk {
    public void startDisk(){
        System.out.println("启动桌面");
    }
    public void shutdownDisk(){
        System.out.println("关闭桌面");
    }
}
/**
 * 电脑
 */
public class Computer {
    private CPU cpu = null;
    private Memory memory = null;
    private Disk disk = null;
    public Computer(){
        this.cpu = new CPU();
        this.memory = new Memory();
        this.disk = new Disk();
    }

    /**
     * 启动电脑
     */
    public void start(){
        this.cpu.startCpu();
        this.memory.startMemory();
        this.disk.startDisk();
    }

    /**
     * 关闭电脑
     */
    public void shutdown(){
        this.cpu.shutdownCpu();
        this.memory.shutdownMemory();
        this.disk.shutdownDisk();
    }
}
public class Main {
    public static void main(String[] args) {
        Computer computer = new Computer();
        computer.start();//启动电脑
        System.out.println("------------------------------------------");
        computer.shutdown();//关闭电脑
    }
}

 

优缺点:

优:

  • 松散耦合:使得客户端和子系统之间解耦,让子系统内部的模块功能更容易扩展和维护;
  • 简单易用:客户端根本不需要知道子系统内部的实现,或者根本不需要知道子系统内部的构成,它只需要跟Facade类交互即可。
  • 更好的划分访问层次:有些方法是对系统外的,有些方法是系统内部相互交互的使用的。子系统把那些暴露给外部的功能集中到门面中,这样就可以实现客户端的使用,很好的隐藏了子系统内部的细节

 

应用场景:

为复杂的模块或子系统提供外界访问的模块

子系统相互独立

在层析结构中,可以使用外观模式定义系统的每一层的入口。

 

源码地址:https://github.com/qjm201000/design_pattern_facade.git

 

posted @ 2018-12-05 10:34  qjm201000  阅读(147)  评论(0编辑  收藏  举报