美文网首页
设计模式之外观(Facade)

设计模式之外观(Facade)

作者: ikonan | 来源:发表于2018-08-02 09:15 被阅读73次

    概述

    外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用。

    场景及角色的介绍

    使用场景

    简单来说,该模式就是把一些复杂的流程封装成一个接口供给外部用户更简单的使用。这个模式中,设计到3个角色。

    • 门面角色:外观模式的核心。它被客户角色调用,它熟悉子系统的功能。内部根据客户角色的需求预定了几种功能的组合。
    • 子系统角色:实现了子系统的功能。它对客户角色和Facade时未知的。它内部可以有系统内的相互交互,也可以由供外界调用的接口。
    • 客户角色:通过调用Facede来完成要实现的功能
    使用场景
    • 为复杂的模块或子系统提供外界访问的模块
    • 子系统相互独立
    • 在层析结构中,可以使用外观模式定义系统的每一层的入口

    类图

    外观模式(Facade)结构图

    实例

    下面,我们就通过一个简单的例子来实现该模式。每个Computer都有CPU、Memory、Disk。在Computer开启和关闭的时候,相应的部件也会开启和关闭,所以,使用了该外观模式后,会使用户和部件之间解耦

    cpu子系统类

    /**
     * cpu子系统类
     * @author Administrator
     *
     */
    public class CPU {
        public static final Logger LOGGER = Logger.getLogger(CPU.class);
        public void start() {
            LOGGER.info("cpu is start...");
        }
        
        public void shutDown() {
            LOGGER.info("CPU is shutDown...");
        }
    }
    

    Disk子系统类

    /**
     * Disk子系统类
     * @author Administrator
     *
     */
    public class Disk{
        public static final Logger LOGGER = Logger.getLogger(Disk.class);
        public void start() {
            LOGGER.info("Disk is start...");
        }
        
        public void shutDown() {
            LOGGER.info("Disk is shutDown...");
        }
    }
    

    Memory子系统类

    /**
     * Memory子系统类
     * @author Administrator
     *
     */
    public class Memory {
        public static final Logger LOGGER = Logger.getLogger(Memory.class);
        public void start() {
            LOGGER.info("Memory is start...");
        }
        
        public void shutDown() {
            LOGGER.info("Memory is shutDown...");
        }
    }
    

    然后是,门面类Facade

    /**
     * 门面类(核心)
     * @author Administrator
     *
     */
    public class Computer {
        public static final Logger LOGGER = Logger.getLogger(Computer.class);
        
        private CPU cpu;
        private Memory memory;
        private Disk disk;
        public Computer() {
            cpu = new CPU();
            memory = new Memory();
            disk = new Disk();
        }
    
        public void start() {
            LOGGER.info("Computer start begin");
            cpu.start();
            disk.start();
            memory.start();
            LOGGER.info("Computer start end");
        }
        
        public void shutDown() {
            LOGGER.info("Computer shutDown begin");
            cpu.shutDown();
            disk.shutDown();
            memory.shutDown();
            LOGGER.info("Computer shutDown end...");
        }
    }
    

    最后为,客户角色

    /**
     * 客户端类
     * @author Administrator
     *
     */
    public class Cilent {
        public static final Logger LOGGER = Logger.getLogger(Cilent.class);
        public static void main(String[] args) {
            Computer computer = new Computer();
            computer.start();
            LOGGER.info("=================");
            computer.shutDown();
        }
    }
    
    运行结果
    Computer start begin
    cpu is start...
    Disk is start...
    Memory is start...
    Computer start end
    =================
    Computer shutDown begin
    CPU is shutDown...
    Disk is shutDown...
    Memory is shutDown...
    Computer shutDown end...
    

    总结

    外观模式的目的不是给予子系统添加新的功能接口,而是为了让外部减少与子系统内多个模块的交互,松散耦合,从而让外部能够更简单地使用子系统。

    外观模式的本质是:封装交互,简化调用。

    相关文章

      网友评论

          本文标题:设计模式之外观(Facade)

          本文链接:https://www.haomeiwen.com/subject/fmfjvftx.html