• 设计模式-外观模式模式


    外观模式(结构型模式)

    • 定义

    外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易试用。[DP]

    外观模式简单点说,就是通过外观类把所有的子系统类进行组合,供外部调用。

    这样既不暴露内部,也降低了耦合。对照下面这张图能很好的理解外观模式(MVC三层架构就使用到了外观模式)


    • 特点
    1. 子系统不被直接调用
    2. 外观类去组合所有的子系统类实现,供外部使用。
    3. 外观类需要知道所有子系统

    • 结构

    Client:外部调用类,客户端类

    Facade:外观类

    SubSystem Classes:子系统类


    • 代码

    例子:启动电脑时,会启动CPU、硬盘、显卡。现在电脑类作为外观类,CPU、硬盘、显卡类作为子系统类,使用电脑的人作为客户端。客户端只允许电脑开机和电脑关机,CPU、硬盘、显卡的启动和停止交给电脑类(外观类)。

          子系统类集

    /**
     * @ Author     :fonxi
     * @ Date       :2019/5/24 12:38
     * @ Description:CPU
     */
    public class CPU {
        public void start(){
            System.out.println("CPU开始运行");
        }
    
        public void stop(){
            System.out.println("CPU停止运行");
        }
    }
    

      

    /**
     * @ Author     :fonxi
     * @ Date       :2019/5/24 12:45
     * @ Description:硬盘
     */
    public class HardDisk {
        public void start(){
            System.out.println("硬盘开始运行");
        }
    
        public void stop(){
            System.out.println("硬盘停止运行");
        }
    }
    

      

    /**
     * @ Author     :fonxi
     * @ Date       :2019/5/24 12:45
     * @ Description:显卡
     */
    public class GraphicsCard {
        public void start(){
            System.out.println("显卡开始运行");
        }
    
        public void stop(){
            System.out.println("显卡停止运行");
        }
    }
    

      外观类

    /**
     * @ Author     :fonxi
     * @ Date       :2019/5/24 12:34
     * @ Description:外观类 电脑类
     */
    public class Facade {
    
        private CPU cpu;
        private GraphicsCard graphicsCard;
        private HardDisk hardDisk;
    
        public Facade(){
            cpu = new CPU();
            graphicsCard = new GraphicsCard();
            hardDisk = new HardDisk();
        }
    
        //电脑开机
        public void startingUp(){
            cpu.start();
            graphicsCard.start();
            hardDisk.start();
        }
    
        //电脑关机
        public void shutdown(){
            cpu.stop();
            graphicsCard.stop();
            hardDisk.stop();
        }
    }
    

      客户端调用类

    /**
     * @ Author     :fonxi
     * @ Date       :2019/5/24 12:33
     * @ Description:客户端调用类
     */
    public class TestController {
        public void print(){
            Facade facade = new Facade();
            System.out.println("开机");
            facade.startingUp();
            System.out.println("关机");
            facade.shutdown();
        }
    }
    

      输出结果

    开机
    CPU开始运行
    显卡开始运行
    硬盘开始运行
    关机
    CPU停止运行
    显卡停止运行
    硬盘停止运行
    

     很明显,客户端只进行了开关机,而子系统集的CPU、硬盘、显卡的启动和停止都是由外观类来完成的。


    • 使用场景
    1. 当子系统类需要很高的安全性,需要隐藏,不被其他人访问时。
    2. 当子系统类外部使用起来特别复杂时

    • 优缺点

    优点:

    1. 内部隐藏,安全
    2. 内外部不直接访问,降低了耦合度
    3. 减少依赖,提高了灵活度

    缺点:

    1. 违反开闭原则,外观类耦合,修改时麻烦
    2. 增加外观类,系统复杂性提升

    • 总结

    外观模式减少外部与内部的交互,使系统松散耦合,外部调用简便。

  • 相关阅读:
    JS_0051:JS GET 请求 获取 url 返回的参数 ; 模拟延时效果 ; 判断手机电脑并跳转
    H50081:背景音乐按钮创建 html元素上禁止拖拽
    CSS0026: div 内 多元素 水平 垂直 均匀 居中 显示
    JS_0056:JS 判断页面加载完成
    JS_0050:JS 字符串加密 解密
    JS_0054:JS 动态设置字体大小 JS 判断浏览器是否联网
    Ajax0007: ajax 同步发送 GET 请求
    JS_0052:JS 禁止触摸屏双指放大,双指缩放。
    移动端调试工具vConsole
    使用安卓 studio 更换app图标
  • 原文地址:https://www.cnblogs.com/fonxi/p/10928546.html
Copyright © 2020-2023  润新知