您现在的位置是:亿华云 > 系统运维
设计模式系列|之外观(门面)模式
亿华云2025-10-08 23:20:55【系统运维】7人已围观
简介本文转载自微信公众号「狼王编程」,作者狼王。转载本文请联系狼王编程公众号。1、概述外观模式是一种结构型设计模式, 能为程序库、 框架或其他复杂类提供一个简单的接口。避免多种不相关的功能污染单一外观,
本文转载自微信公众号「狼王编程」,设计式作者狼王。模式面模转载本文请联系狼王编程公众号。系列
1、观门概述
外观模式是设计式一种结构型设计模式, 能为程序库、模式面模 框架或其他复杂类提供一个简单的系列接口。
避免多种不相关的观门功能污染单一外观, 使其变成又一个复杂结构。设计式客户端和其他外观都可使用附加外观。模式面模
2、系列适用场景
1)如果你需要一个指向复杂子系统的观门直接接口, 且该接口的设计式功能有限, 则可以使用外观模式。模式面模外观将会提供指向子系统中最常用功能的系列快捷方式, 能够满足客户端的大部分需求。
2)如果需要将子系统组织为多层结构, 可以使用外观。你可以为每个层次创建一个外观, 然后要求各层的类必须通过这些外观进行交互。服务器租用
3、实例
有以下场景:
当前有学生子系统,该系统有三个接口,查询学生姓名,查询学生年龄,查询学生家庭地址。
有一个教学系统,要分别去调用这三个接口。
有一个成绩系统,要分别调用者三个接口。
有一个考试系统,也要分别调用这三个系统。
3.1 不使用外观模式时候
/** * 学生 */ public class Student { private String name = "狼王"; private int age = 25; private String address = "上海"; public Student(String name, int age, String address) { this.name = name; this.age = age; this.address = address; } public Student(){ } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } } /** * 学生 */ public class Student { private String name = "狼王"; private int age = 25; private String address = "上海"; public Student(String name, int age, String address) { this.name = name; this.age = age; this.address = address; } public Student(){ } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } } /** * 年龄接口 */ @Service public class StudentAgeService implements IStudentAge{ @Override public int getAge() { Student student = new Student(); return student.getAge(); } } @Service public class StudentNameService implements IStudentName{ @Override public String getName() { Student student = new Student(); return student.getName(); } }三个外部服务
/** * 教育服务 */ @Service public class EduService { @Autowired private StudentNameService studentNameService; @Autowired private StudentAgeService studentAgeService; @Autowired private StudentAddressService studentAddressService; public void getStudentName(){ System.out.println("学生姓名是:" + studentNameService.getName()); } public void getStudentAge(){ System.out.println("学生年龄是:" + studentAgeService.getAge()); } public void getStudentAddress(){ System.out.println("学生地址是:" + studentAddressService.getAddress()); } } /** * 考试服务 */ @Service public class ExamService { @Autowired private StudentNameService studentNameService; @Autowired private StudentAgeService studentAgeService; @Autowired private StudentAddressService studentAddressService; public void getStudentName(){ System.out.println("学生姓名是:" + studentNameService.getName()); } public void getStudentAge(){ System.out.println("学生年龄是:" + studentAgeService.getAge()); } public void getStudentAddress(){ System.out.println("学生地址是:" + studentAddressService.getAddress()); } } /** * 成绩服务 */ @Service public class ScoreService { @Autowired private StudentNameService studentNameService; @Autowired private StudentAgeService studentAgeService; @Autowired private StudentAddressService studentAddressService; public void getStudentName(){ System.out.println("学生姓名是:" + studentNameService.getName()); } public void getStudentAge(){ System.out.println("学生年龄是:" + studentAgeService.getAge()); } public void getStudentAddress(){ System.out.println("学生地址是:" + studentAddressService.getAddress()); } }3.2 使用外观模式
在学生服务这里增加一个外观service
/** * 外观模式服务 */ @Service public class StudentFacedService { @Autowired private StudentNameService studentNameService; @Autowired private StudentAgeService studentAgeService; @Autowired private StudentAddressService studentAddressService; public String getStudentName(){ return studentNameService.getName(); } public int getStudentAge(){ return studentAgeService.getAge(); } public String getStudentAddress(){ return studentAddressService.getAddress(); } }三个调用服务只需要引入外观服务
/** * 教育服务 */ @Service public class EduService { @Autowired private StudentFacedService studentFacedService; public void getStudentName() { System.out.println("学生姓名是:" + studentFacedService.getStudentName()); } public void getStudentAge() { System.out.println("学生年龄是:" + studentFacedService.getStudentAge()); } public void getStudentAddress() { System.out.println("学生地址是:" + studentFacedService.getStudentAddress()); } } /** * 考试服务 */ @Service public class ExamService { @Autowired private StudentFacedService studentFacedService; public void getStudentName() { System.out.println("学生姓名是:" + studentFacedService.getStudentName()); } public void getStudentAge() { System.out.println("学生年龄是:" + studentFacedService.getStudentAge()); } public void getStudentAddress() { System.out.println("学生地址是网站模板:" + studentFacedService.getStudentAddress()); } } /** * 成绩服务 */ @Service public class ScoreService { @Autowired private StudentFacedService studentFacedService; public void getStudentName() { System.out.println("学生姓名是:" + studentFacedService.getStudentName()); } public void getStudentAge() { System.out.println("学生年龄是:" + studentFacedService.getStudentAge()); } public void getStudentAddress() { System.out.println("学生地址是:" + studentFacedService.getStudentAddress()); } }4、分析
以上两种方式代码结构如下所示:
从上面两张图可以看到,对于外部服务来说,极大的缩减了代码复杂度,只需要调用学生服务的一个接口。
5、总结
优点:
让客户端代码独立独立于复杂的子系统,且减少对于子系统的依赖。
缺点:
过于庞大的外观,会使得该外观称成为上帝对象,造成所有类的耦合,可通过它操作所有的类功能。
好了。今天就说到这了,我还会不断分享自己的所学所想,希望我们一起走在成功的b2b信息网道路上!
很赞哦!(91)
相关文章
- 因为域名解析需要同步到DNS根服务器,而DNS根服务器会不定时刷,只有DNS根服务器刷新后域名才能正常访问,新增解析一般会在10分钟左右生效,最长不会超过24小时,修改解析时间会稍微延长。
- 什么?可以在 HTML 中直接插入 Python 代码?
- 值得尝试的 30 个开源文本编辑器
- 做产品,选择从0到1还是从1到N?
- .com域名是国际最广泛流行的通用域名,目前全球注册量第一的域名,公司企业注册域名的首选。国际化公司通常会注册该类域名。
- 为什么ConcurrentHashMap不允许插入Null值?
- 秒懂算法—动态规划的核心思想
- 详解MySQL查看数据库表容量大小的方法总结
- 5、企业注册国内域名需要证件,其它情况一律不需要证件。
- 原生图数据库的15条规则
站长推荐
a、变更前的公司证件扫描件(代码证或者营业执照)及联系人身份证复印件、变更后的公司证件扫描件(代码证或者营业执照)及新的联系人身份证复印件;身份证复印件需本人签名,公司证件复印件需加盖公章。
C语言为什么不检查数组下标
中国首位游戏设计博士黄石:今日之技术即未来之艺术!所有技术都在加速发展
编程题:实现一个 LazyMan 方法
在数以亿计的网站中,我们应该抓住每一个可能带来宣传的机会,域名可以带有企业的名字,一般可以使用汉语拼音或者英语单词或者是相关缩写的形式,只要用户记住了你企业的名字,就能很容易的打出你的网站域名,同样的,记住了网站域名也能很快的记住你公司的名字。
聊聊 CSS 中的 BFC 是什么?
八种技巧让你编写更简洁的 JavaScript 代码
Python这些操作,逆天且实用!