如何使用设计模式的外观模式
导读:本文共3601字符,通常情况下阅读需要12分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 1、概述外观模式是一种结构型设计模式, 能为程序库、 框架或其他复杂类提供一个简单的接口。避免多种不相关的功能污染单一外观, 使其变成又一个复杂结构。客户端和其他外观都可使用附加外观。2、适用场景1)如果你需要一个指向复杂子系统的直接接口, 且该接口的功能有限, 则可以使用外观模式。外观将会提供指向子系统中最常用功能的快捷方式, 能够满足客户端的大部分需求。2)... ...
目录
(为您整理了一些要点),点击可以直达。1、概述
外观模式是一种结构型设计模式, 能为程序库、 框架或其他复杂类提供一个简单的接口。
避免多种不相关的功能污染单一外观, 使其变成又一个复杂结构。客户端和其他外观都可使用附加外观。
2、适用场景
1)如果你需要一个指向复杂子系统的直接接口, 且该接口的功能有限, 则可以使用外观模式。外观将会提供指向子系统中最常用功能的快捷方式, 能够满足客户端的大部分需求。
2)如果需要将子系统组织为多层结构, 可以使用外观。你可以为每个层次创建一个外观, 然后要求各层的类必须通过这些外观进行交互。
3、实例
有以下场景:
当前有学生子系统,该系统有三个接口,查询学生姓名,查询学生年龄,查询学生家庭地址。
有一个教学系统,要分别去调用这三个接口。
有一个成绩系统,要分别调用者三个接口。
有一个考试系统,也要分别调用这三个系统。
3.1 不使用外观模式时候
/***学生*/publicclassStudent{privateStringname="狼王";privateintage=25;privateStringaddress="上海";publicStudent(Stringname,intage,Stringaddress){this.name=name;this.age=age;this.address=address;}publicStudent(){}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}publicStringgetAddress(){returnaddress;}publicvoidsetAddress(Stringaddress){this.address=address;}}
/***学生*/publicclassStudent{privateStringname="狼王";privateintage=25;privateStringaddress="上海";publicStudent(Stringname,intage,Stringaddress){this.name=name;this.age=age;this.address=address;}publicStudent(){}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}publicStringgetAddress(){returnaddress;}publicvoidsetAddress(Stringaddress){this.address=address;}}
/***年龄接口*/@ServicepublicclassStudentAgeServiceimplementsIStudentAge{@OverridepublicintgetAge(){Studentstudent=newStudent();returnstudent.getAge();}}
@ServicepublicclassStudentNameServiceimplementsIStudentName{@OverridepublicStringgetName(){Studentstudent=newStudent();returnstudent.getName();}}
三个外部服务
/***教育服务*/@ServicepublicclassEduService{@AutowiredprivateStudentNameServicestudentNameService;@AutowiredprivateStudentAgeServicestudentAgeService;@AutowiredprivateStudentAddressServicestudentAddressService;publicvoidgetStudentName(){System.out.println("学生姓名是:"+studentNameService.getName());}publicvoidgetStudentAge(){System.out.println("学生年龄是:"+studentAgeService.getAge());}publicvoidgetStudentAddress(){System.out.println("学生地址是:"+studentAddressService.getAddress());}}
/***考试服务*/@ServicepublicclassExamService{@AutowiredprivateStudentNameServicestudentNameService;@AutowiredprivateStudentAgeServicestudentAgeService;@AutowiredprivateStudentAddressServicestudentAddressService;publicvoidgetStudentName(){System.out.println("学生姓名是:"+studentNameService.getName());}publicvoidgetStudentAge(){System.out.println("学生年龄是:"+studentAgeService.getAge());}publicvoidgetStudentAddress(){System.out.println("学生地址是:"+studentAddressService.getAddress());}}
/***成绩服务*/@ServicepublicclassScoreService{@AutowiredprivateStudentNameServicestudentNameService;@AutowiredprivateStudentAgeServicestudentAgeService;@AutowiredprivateStudentAddressServicestudentAddressService;publicvoidgetStudentName(){System.out.println("学生姓名是:"+studentNameService.getName());}publicvoidgetStudentAge(){System.out.println("学生年龄是:"+studentAgeService.getAge());}publicvoidgetStudentAddress(){System.out.println("学生地址是:"+studentAddressService.getAddress());}}
3.2 使用外观模式
在学生服务这里增加一个外观service
/***外观模式服务*/@ServicepublicclassStudentFacedService{@AutowiredprivateStudentNameServicestudentNameService;@AutowiredprivateStudentAgeServicestudentAgeService;@AutowiredprivateStudentAddressServicestudentAddressService;publicStringgetStudentName(){returnstudentNameService.getName();}publicintgetStudentAge(){returnstudentAgeService.getAge();}publicStringgetStudentAddress(){returnstudentAddressService.getAddress();}}
三个调用服务只需要引入外观服务
/***教育服务*/@ServicepublicclassEduService{@AutowiredprivateStudentFacedServicestudentFacedService;publicvoidgetStudentName(){System.out.println("学生姓名是:"+studentFacedService.getStudentName());}publicvoidgetStudentAge(){System.out.println("学生年龄是:"+studentFacedService.getStudentAge());}publicvoidgetStudentAddress(){System.out.println("学生地址是:"+studentFacedService.getStudentAddress());}}
/***考试服务*/@ServicepublicclassExamService{@AutowiredprivateStudentFacedServicestudentFacedService;publicvoidgetStudentName(){System.out.println("学生姓名是:"+studentFacedService.getStudentName());}publicvoidgetStudentAge(){System.out.println("学生年龄是:"+studentFacedService.getStudentAge());}publicvoidgetStudentAddress(){System.out.println("学生地址是:"+studentFacedService.getStudentAddress());}}
/***成绩服务*/@ServicepublicclassScoreService{@AutowiredprivateStudentFacedServicestudentFacedService;publicvoidgetStudentName(){System.out.println("学生姓名是:"+studentFacedService.getStudentName());}publicvoidgetStudentAge(){System.out.println("学生年龄是:"+studentFacedService.getStudentAge());}publicvoidgetStudentAddress(){System.out.println("学生地址是:"+studentFacedService.getStudentAddress());}}
4、分析
以上两种方式代码结构如下所示:
从上面两张图可以看到,对于外部服务来说,极大的缩减了代码复杂度,只需要调用学生服务的一个接口。
5、总结
优点:
让客户端代码独立独立于复杂的子系统,且减少对于子系统的依赖。
缺点:
过于庞大的外观,会使得该外观称成为上帝对象,造成所有类的耦合,可通过它操作所有的类功能。
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
如何使用设计模式的外观模式的详细内容,希望对您有所帮助,信息来源于网络。