喵星之旅-沉睡的猫咪-门面模式

门面模式是什么?

当一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂。这时如果系统内部发生改变,客户端也要跟着改变,这违背了“开闭原则”,也违背了“迪米特法则”,所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标。

门面模式又叫外观模式,提供了一个统一的接口,用来访问子系统中的一群接口。其主要特征是定义了一个高层接口,让子系统更容易使用,属于结构型模式。可以理解为接口的封装。

门面模式有哪些应用?

项目开发中不同分层。对于一个功能,如果是后台系统提供的支持,那么它可能用到了很多数据源、业务,但是对外只提供一个访问接口就可以实现功能,把内部的细节都封装到了一起,就是门面模式。

任何的对外api接口基本都是门面模式,因为极少的api接口内部是十分简单的,一般都会涉及很多的模块、功能。

例如有一张保单的投保,其实也是门面的,我们只是和一家保险公司签订合同,但是实际上,绝大部分的保单都要涉及几家、十几家、甚至几十家保险公司,只是投保人不知道具体的情况,而且出现赔款时,只需要找签订合同的那一家就可以了。将几十家保险公司共同的担保封装成了一个公司的业务,就是门面的思想。

代码示例

门面类

package structure.facade;
/**
 *
 * @author bunny~~我是兔子我会喵,我叫喵星兔。
 *
 */
public class Computer { private Cpu cpu; private Disk disk; private Memory memory; public void startup() { cpu.start(); memory.start(); disk.start(); System.out.println("计算机已经启动。"); } public Computer(Cpu cpu, Disk disk, Memory memory) { super(); this.cpu = cpu; this.disk = disk; this.memory = memory; } public Cpu getCpu() { return cpu; } public void setCpu(Cpu cpu) { this.cpu = cpu; } public Disk getDisk() { return disk; } public void setDisk(Disk disk) { this.disk = disk; } public Memory getMemory() { return memory; } public void setMemory(Memory memory) { this.memory = memory; } @Override public String toString() { return "Computer [cpu=" + cpu + ", disk=" + disk + ", memory=" + memory + "]"; } }

子系统1

package structure.facade;
/**
 *
 * @author bunny~~我是兔子我会喵,我叫喵星兔。
 *
 */
public interface Cpu { void start(); }
package structure.facade;
/**
 *
 * @author bunny~~我是兔子我会喵,我叫喵星兔。
 *
 */
public class MyCpu implements Cpu {

    @Override
    public void start() {
        System.out.println("cpu已经启动。");
    }

}

子系统2

package structure.facade;
/**
 *
 * @author bunny~~我是兔子我会喵,我叫喵星兔。
 *
 */
public interface Disk {
    void start();
}
package structure.facade;
/**
 *
 * @author bunny~~我是兔子我会喵,我叫喵星兔。
 *
 */
public class MyDisk implements Disk {

    @Override
    public void start() {
        System.out.println("硬盘已经启动。");
    }

}

子系统3

package structure.facade;
/**
 *
 * @author bunny~~我是兔子我会喵,我叫喵星兔。
 *
 */
public interface Memory {
    void start();
}
package structure.facade;
/**
 *
 * @author bunny~~我是兔子我会喵,我叫喵星兔。
 *
 */
public class MyMemory implements Memory {

    @Override
    public void start() {
        System.out.println("内存已经启动。");
    }

}

测试类

package structure.facade;
/**
 *
 * @author bunny~~我是兔子我会喵,我叫喵星兔。
 *
 */
public class Test {

    public static void main(String[] args) {
        Computer c = new Computer(new MyCpu(), new MyDisk(), new MyMemory());
        c.startup();

    }

}

门面模式的特点

简化了调用过程,无需深入了解子系统,以防给子系统带来风险。对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。

更好地划分访问层次,提高了安全性。降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。


遵循迪米特法则。

ps:项目地址  svn://47.105.188.20/kitty/2%E3%80%81code/pattern    用户名密码:reader/reader

原文地址:https://www.cnblogs.com/kittybunny/p/12425875.html

时间: 2024-07-30 22:28:00

喵星之旅-沉睡的猫咪-门面模式的相关文章

喵星之旅-沉睡的猫咪-面向对象的设计原则

一.设计原则是什么? 有句话叫“人民群众是历史的创造者”,他的意思我理解为任何的理论都是基于具体的客观展现总结出来的,没有人民创造的既定事实,就无法出现任何的有理有据的理论模型. 对于面向对象的软件设计,最著名的一本书就应该是当年gof的那一本<设计模式:可复用面向对象软件的基础>.设计模式是面对具体问题,进行抽象分类,然后总结出来的行之有效的解决方案,就像人去创造历史.设计原则是进一步研究这些解决方案,进一步抽象出的指导思想. 如果把设计模式比喻成传统数学,即“1+1=2”的那套理论,那么设

喵星之旅-沉睡的猫咪-类加载机制

从源码到类文件 java文件—词法分析—tokens流--语法分析--语法树--语义分析--注解抽象语法树--字节码生成器--class文件 简单来说就是编译过程. 从类文件到虚拟机 装载:查找导入class文件 验证:文件格式.字节码验证.符号引用验证等 准备:为静态量分配内存,初始化为“默认值” 解析:符号引用转换为直接引用(获取内存地址) 初始化:静态量真正赋值 类加载器 装载是通过类加载器实现的,java中有4个加载器: 最高级的顾问(外援):外部资源 高级长官(老大,一般人见不到):内

喵星之旅-狂奔的兔子-基于docker的rabbitmq安装

docker安装参考:喵星之旅-狂奔的兔子-docker安装和基本使用 一.查询镜像名称 由于我们要安装的是有web管理页面的,不能直接拉取,需要指定版本. 登录docker仓库查询:https://hub.docker.com/ 查询位置输入 rabbitmq 右侧结果第一个就是,点击进去 页面下拉就会有各种可选择的版本号 选择带有“mangement”的版本 3.8-management 二.创建容器 1.拉取镜像 docker pull rabbitmq:3.8-management 2.

喵星之旅-狂奔的兔子-基于docker的redis分布式集群

一.docker安装(略) 二.下载redis安装包(redis-4.0.8.tar.gz) 以任何方式获取都可以.自行官网下载. 三.拉取centos7的docker镜像 命令:docker pull centos:7 这种基于操作系统的安装也适合虚拟机.真机等环境,而且之前查询资料也都是这种情况开始,没有看到直接跳过这步的样例. 四.创建docker网络 由于集群环境要求有明确的ip配置,需要提供固定ip,所以这里创建容器时指定ip,这就要求有可用的网络信息. docker network

NABCD模型(猫咪记单词)

项目需求分析与建议-NABCD模型(猫咪记单词) N (Need 需求) 对于现在的学生,尤其是大学生来说,学习英语是一件非常重要的事.我们有四级六级托福雅思等各种各样的英语方面的考试.而学习英语,很重要的就是词汇量,那么如何提高词汇量呢,无疑就是背单词了.但是单纯的背单词太过单调乏味,很难坚持下来.所以寻找一些合适的,更易于接受的背单词学习英语的方法就很有必要了. A (Approach 做法) 为了解决这个单纯的背单词枯燥难以坚持的问题,我们设计了猫咪记单词.学生们每天接触的最多的不是书,而

软件需求分析之猫咪记单词

软件需求分析之猫咪记单词 一.软件设计目标 目前,所有学生都面临学习英语的问题.在大学生中学生对于手机的应用十分频繁,所以我们设置单词解屏,可以使学生拿起手机就学习英语,提高学习效率,应用零散时间. 二.面向用户 本单词解屏面向的对象为所有会学习到英语的学生:四级.六级.托福.雅思等.主要是要考四六级的大学生,或者要出国学习的学生,或者在生活中热爱英语的人. 三.功能实现 我们主要有词库选择,词数设置,已学词量三个功能.词库选择:对词汇的类型进行选择,如四六级.托福.雅思等. 词数设置:对解屏的

猫咪记单词——NABCD模型分析

N ——Need 需求:学习英语是一件非常重要的事.面对各种各样的考试,学习英语,最重要的就是词汇量,背单词是提高词汇量的最直接的方法,但是单纯的背单词太单调.寻找一些合适的,更易于接受的背单词学习英语的方法. A ——Approach 做法:为了解决这个单纯的背单词枯燥难以坚持的问题,我们设计了猫咪记单词.通过锁屏的方式,来让用户每次解锁时都能学习英语. B ——Benefit好处:有了这个软件之后,不用每天抱着一本大厚书学习新单词还要复习旧单词,只要拿着手机,在解屏的时候看几眼随便蹦出来的单

使用SVG画猫咪

SVG画简易小猫咪: 第一幅图是别人的,图2是自己画的 -----------------------------分割线---------------------------- 代码部分: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>好玩的SVG---可爱的小猫咪</title> </hea

竖屏小游戏--喵星战争源代码分析【完整】

 转载请注明出处:http://blog.csdn.net/oyangyufu/article/details/26942311 源代码地址:http://download.csdn.net/detail/oyangyufu/7409593 Ccp文件介绍: GameMenuScene.cpp游戏主菜单 GameMainScene.cpp游戏主页面 GameObjHero.cpp主角 GameHeroBullet.cpp主角的子弹 GameObjEnemy.cpp敌人 GameEnemyBull