这篇文章主要介绍“如何使用设计模式的外观模式”,在日常操作中,相信很多人在如何使用设计模式的外观模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用设计模式的外观模式”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
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、总结
优点:
让客户端代码独立独立于复杂的子系统,且减少对于子系统的依赖。
缺点:
过于庞大的外观,会使得该外观称成为上帝对象,造成所有类的耦合,可通过它操作所有的类功能。
到此,关于“如何使用设计模式的外观模式”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!