当前位置: 首页 > 科技观察

设计模式系列-外观(门面)模式

时间:2023-03-21 00:38:14 科技观察

本文转载自微信公众号《狼王编程》,作者狼王。转载本文请联系狼王编程公众号。1.概述外观模式是一种结构设计模式,它为库、框架或其他复杂类提供简单的接口。避免多个不相关的功能污染单个外观,使其成为另一个复杂的结构。附加皮肤可用于客户端和其他皮肤。2、适用场景1)如果需要直接接口一个功能有限的复杂子系统,可以使用外观模式。门面会提供子系统中最常用功能的快捷方式,可以满足客户端的大部分需求。2)如果需要将子系统组织成多层结构,可以使用appearance。可以为每一层创建一个皮肤,然后要求每一层的类必须通过这些皮肤进行交互。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;}三外部服务/***教育服务*/@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;@AutowiredprivateStudentAddressServicestudentAddress(){System.out.println("学生姓名:"+studentNameService.getName());}publicvoidgetStudentAge(){System.out.println("学生年龄:"+studentAgeService.getAge());}publicvoidgetStudentAddress(){System.out.println("学生地址为:"+studentAddressService.getAddress());}}3.2使用外观模式添加外观服务/***外观模式服务*/@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、分析上面两个方法的代码结构如下:从上面两张图可以看出,对外服务,代码复杂度大大降低,只需要调用学生服务的一个接口即可。子系统,减少对子系统的依赖。缺点:外观太大会使外观成为上帝对象,造成所有类的耦合,所有类的功能都可以通过它来操作。好吧。今天就到这里吧,我会继续分享我的所学所想,希望我们一起走在成功的路上!

最新推荐
猜你喜欢