【设计模式】外观模式

约定不等于承诺〃 2022-07-16 01:27 416阅读 0赞

前言

Github:https://github.com/yihonglei/java-design-patterns

一 外观模式作用

为子系统中的一组接口提供一个一致的界面, Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

可以使得子系统与客户系统解耦。

二 应用场景

1)当需要为一个复杂子系统提供一个简单接口时。子系统通常因为不断演化而变得越来越复杂。

大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,

但这也给那些不需要定制子系统的用户带来一些使用上的困难。facade可以提供一个简单的缺省视图,

这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过facade层。

2)客户程序与抽象类的实现部分之间存在着很大的依赖性。引入 facade将这个子系统与客户以及其他的子系统分离,

可以提高子系统的独立性 和可移植性。

3)当你需要构建一个层次结构的子系统时,使用 facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,

你可以让它们仅通过facade进行通讯,从而简化了它们之间的依赖关系。

三 UML图

外观模式静态类图:

70

四 参与对象

1)Facade(外观角色)

是模式的核心,他被客户client角色调用,知道各个子系统的功能。将客户的请求代理给适当的子系统对象。

2)Subsystem classes(子系统角色)

实现子系统的功能,并处理由Facade对象指派的任务。对子系统而言,facade和client角色是未知的,

没有Facade的任何相关信息;即没有指向Facade的实例。

3)client(客户程序)

调用facade角色获得完成相应的功能。

五 外观模式实战

一个总电源开关控制电灯,冰箱,洗衣机,电视,电脑等家用电器的子开关,电源总开关即为外观模式。

Facade

  1. package com.jpeony.design.patterns.facade;
  2. /**
  3. * Facade: 外观核心,负责处理客户端的请求给合适的子系统对象
  4. *
  5. * @author yihonglei
  6. */
  7. public class SwitchFacade {
  8. /**
  9. * 外观模式所有遇到的组件都放在这里
  10. */
  11. LightService ls;
  12. TelevisionService ts;
  13. public SwitchFacade() {
  14. ls = new LightServiceImpl();
  15. ts = new TelevisionServiceImpl();
  16. }
  17. public void open() {
  18. ls.openLight();
  19. ts.openTelevision();
  20. }
  21. public void off() {
  22. ls.offLight();
  23. ts.offTelevision();
  24. }
  25. }

Subsystem classes

灯开关功能实现

  1. package com.jpeony.design.patterns.facade;
  2. /**
  3. * 子系统接口功能
  4. *
  5. * @author yihonglei
  6. */
  7. public interface LightService {
  8. /**
  9. * 开灯
  10. */
  11. void openLight();
  12. /**
  13. * 关灯
  14. */
  15. void offLight();
  16. }
  17. package com.jpeony.design.patterns.facade;
  18. /**
  19. * @author yihonglei
  20. */
  21. public class LightServiceImpl implements LightService {
  22. @Override
  23. public void openLight() {
  24. System.out.println("天黑了,开灯");
  25. }
  26. @Override
  27. public void offLight() {
  28. System.out.println("天亮了,关灯");
  29. }
  30. }

电视开关功能实现

  1. package com.jpeony.design.patterns.facade;
  2. /**
  3. * 子系统接口功能
  4. *
  5. * @author yihonglei
  6. */
  7. public interface TelevisionService {
  8. /**
  9. * 开电视
  10. */
  11. void openTelevision();
  12. /**
  13. * 关电视
  14. */
  15. void offTelevision();
  16. }
  17. package com.jpeony.design.patterns.facade;
  18. /**
  19. * @author yihonglei
  20. */
  21. public class TelevisionServiceImpl implements TelevisionService {
  22. @Override
  23. public void openTelevision() {
  24. System.out.println("下班的时候打开电视,看电视");
  25. }
  26. @Override
  27. public void offTelevision() {
  28. System.out.println("上班的时候关掉电视,去上班");
  29. }
  30. }

Test

  1. package com.jpeony.design.patterns.facade;
  2. /**
  3. * Client负责调用facade,facade负责分派任务,SubSystemClass负责执行facade分派的任务
  4. *
  5. * @author yihonglei
  6. */
  7. public class Test {
  8. public static void main(String[] args) {
  9. SwitchFacade facade = new SwitchFacade();
  10. /*
  11. * Client
  12. */
  13. facade.open();
  14. System.out.println("=======================");
  15. facade.off();
  16. }
  17. }

运行结果

Center

发表评论

表情:
评论列表 (有 0 条评论,416人围观)

还没有评论,来说两句吧...

相关阅读

    相关 设计模式 - 外观模式

    设计模式 - 外观模式 场景 小张搬家了,新的房间都是智能化,但是每个设备都是独立的,小张每次回家之前需要打开app分别打开每个设备,例如小张回家后的基本操作是开门

    相关 设计模式 - 外观模式

    定义:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这个子系统更加容易使用。 通过将子系统中一系列的接口进行组合形成一个更高层的接口,这样客户

    相关 设计模式——外观模式

    本文主要是讲述结构型模式中一个比较常用的模式-外观模式,这个模式呢,有个最大的特点将细粒度的对象包装成粗粒度的对象,应用程序通过 访问这个外观对象,来完成细粒度对象的调用,外