尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

设计模式结构型——外观模式

设计模式结构型——外观模式 目录什么是外观模式外观模式的实现外观模式角色外观模式举例外观模式类图外观模式代码实现外观模式的特点优点缺点注意事项应用场景总结什么是外观模式外观模式Facade Pattern又叫作门面模式归属于结构型模式。外观模式定义了提供了定义了一个统一的高层接口即为子系统中的一组接口提供一个一致的访问入口使子系统更容易被外部程序统一调用。外部应用程序不用关心内部子系统的具体细节这样会大大降低应用程序的复杂度提高了程序的可维护性。外观模式是为了解决类与类之家的依赖关系的像spring一样可以将类和类之间的关系配置到配置文件中而外观模式就是将他们的关系放在一个Facade类中降低了类类之间的耦合度。外观模式的实现外观模式角色外观角色Facade为多个子系统对外提供一个共同的接口知道哪些子系统负责处理请求将客户端的请求转发给适当的子系统对象。子系统角色Sub System实现子系统的功能处理外观角色指派的任务。客户可以通过外观角色访问它。子系统在整个系统中可以是一个或多个模块每个模块都有若干类组成这些类可能相互之间有着比较复杂的关系。客户角色Client调用外观角色访问各个子系统的功能。外观模式举例举个例子: 比如去图书馆借书, 但图书馆很大不知道所要的东西在哪里. 于是就去问图书馆管理员, 图书馆管理员会马上找到你所要的图书. 这里面我们不用了解图书馆图书的摆放, 直接找图书馆管理员即可. 图书馆管理员这里就是门面, 图书的摆放就是内部构造.这里你代表客户角色图书代表子系统角色图书馆管理员代表外观角色。外观模式类图外观模式代码实现举个例子一美女下班回家第一件开门然后是开灯然后打开空调打开热水器躺在沙发上准备看电视。在智能家居的场景所有电器都绑定啦小爱同学上其他遥控我们无需关注只需要关注小爱同学就好啦。这个时候我们就可以使用外观模式。其中美女属于客户角色小爱同学属于外观角色智能门锁电灯空调热水器电视属于子系统角色。子系统角色package com.common.demo.pattern.facade; /** * author Evan Walker https://www.ayshuju.com * version 1.0 * desc 门锁 子系统角色 * date 2023/07/20 11:05:13 */ public class Lock { public void open(){ System.out.println(打开门锁门锁已打开); } } package com.common.demo.pattern.facade; /** * author Evan Walker https://www.ayshuju.com * version 1.0 * desc 电灯 子系统角色 * date 2023/07/20 11:03:03 */ public class Light { public void open(){ System.out.println(打开电灯电灯已打开); } } package com.common.demo.pattern.facade; /** * author Evan Walker https://www.ayshuju.com * version 1.0 * desc 空调 子系统角色 * date 2023/07/20 11:07:38 */ public class AirConditioner { public void open(){ System.out.println(打开空调空调已打开!); } } package com.common.demo.pattern.facade; /** * author Evan Walker https://www.ayshuju.com * version 1.0 * desc 热水器 子系统角色 * date 2023/07/20 11:03:53 */ public class Heater { public void open(){ System.out.println(打开热水器热水器已打开); } } package com.common.demo.pattern.facade; /** * author Evan Walker https://www.ayshuju.com * version 1.0 * desc 电视 子系统角色 * date 2023/07/20 11:06:04 */ public class Tv { public void open(){ System.out.println(打开电视电视已打开); } }外观角色package com.common.demo.pattern.facade; /** * author Evan Walker https://www.ayshuju.com * version 1.0 * desc 外观角色 * date 2023/07/20 10:59:00 */ public class Facade { private AirConditioner airConditioner; private Tv tv; private Lock lock; private Light light; private Heater heater; public Facade(){ this.airConditioner new AirConditioner(); this.tv new Tv(); this.light new Light(); this.lock new Lock(); this.heater new Heater(); } public void goHome(){ lock.open(); light.open(); airConditioner.open(); heater.open(); tv.open(); } }客户角色package com.common.demo.pattern.facade; /** * author Evan Walker https://www.ayshuju.com * version 1.0 * desc 客户角色 * date 2023/07/20 10:59:15 */ public class Client { public static void main(String[] args) { Facade facade new Facade(); facade.goHome(); } }运行测试截图外观模式的特点优点减少相互依赖实现了子系统与客户之间的松耦合关系子系统的组件变化不会影响到调用它的客户类只需调整外观类即可。提高灵活性对客户屏蔽子系统组件减少了客户处理的对象数目客户代码使用子系统使用起来更加容易。但并不妨碍客户直接访问子系统。提高安全性更好地划分访问层次。迪米特法则遵循迪米特法则即最少知道原则。缺点当增加子系统和扩展系统行为时可能容易带来未知风险。不能很好地限制客户使用子系统类如果对客户访问子系统类做太多的限制则减少了可变性和灵活性。在不引入抽象外观类的情况下增加新的子系统可能需要修改外观类或客户端的源代码违背了“开闭原则”。某些情况下可能违背单一职责原则。注意事项在层次化结构中可使用外观模式定义系统中每一层的入口。一个系统有多个外观类在一个系统中可以设计多个外观类每个外观类都负责和一些特定的子系统交互向用户提供相应的业务功能。不要试图通过外观类为子系统增加新行为外观模式的用意是为子系统提供一个集中化和简化的沟通渠道而不是向子系统加入新的行为新的行为的增加应该通过修改原有子系统类或增加新的子系统类来实现不能通过外观类来实现。外观模式创造出一个外观对象将客户端所涉及的属于一个子系统的协作伙伴的数量减到最少使得客户端与子系统内部的对象的相互作用被外观对象所取代。外观类充当了客户类与子系统类之间的“第三者”降低了客户类与子系统类之间的耦合度外观模式就是实现代码重构以便达到“迪米特法则”要求的一个强有力的武器。外观模式最大的缺点在于违背了“开闭原则”当增加新的子系统或者移除子系统时需要修改外观类可以通过引入抽象外观类在一定程度上解决该问题客户端针对抽象外观类进行编程。对于新的业务需求不修改原有外观类而对应增加一个新的具体外观类由新的具体外观类来关联新的子系统对象同时通过修改配置文件来达到不修改源代码并更换外观类的目的。应用场景减少对子系统的依赖性子系统相对独立且越来越复杂增加门面模式提供接口构建多层系统结构利用门面对象作为每层的入口简化层间调用总结外观模式对客户端与子系统的耦合关系让子系统内部的模块更易维护和扩展。对外屏蔽了子系统的细节因此外观模式降低了客户端对子系统使用的复杂性。当系统需要进行分层设计时可以考虑外观模式帮我们更好的划分访问的层次。
返回列表