欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

外观模式:简化复杂设计的魔法武器

最编程 2024-08-05 22:05:20
...

Github 源码地址

23种设计模式总览

  • java语言设计-23种设计模式总览

创建型模式

  • 工厂方法模式(Factory Method)
  • 抽象工厂模式(Abstract Factory)
  • 建造者模式(Builder)
  • 原型模式(Prototype)
  • 单例模式(Singleton)

结构型模式

  • 外观模式(Facade)
  • 适配器模式(Adapter)
  • 代理模式(Proxy)
  • 组合模式(Composite)
  • 享元模式(Flyweight)
  • 装饰模式(Decorator)
  • 桥接模式(Bridge)

行为型模式

  • 中介者模式(Mediator)
  • 观察者模式(Observer)
  • 命令模式(Command)
  • 迭代器模式(Iterator)
  • 模板方法模式(Template Method)
  • 策略模式(Strategy)
  • 状态模式(State)
  • 备忘录模式(Memento)
  • 解释器模式(Interpreter)
  • 职责链模式(Chain of Responsibility)
  • 访问者模式(Visitor)

1.定义

要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。外观模式提供一个高层次的接口,使得子系统更易于使用。

2.介绍

  • 外观模式属于结构型模式。
  • 外观模式也叫门面模式。
  • 通常我们对API进行封装,都会用到外观模式,只是我们可能不知道而已。外观模式通过一个外观类使得整个系统的结构只有一个统一的高层接口,这样能降低用户的使用成本。

3. 应用场景

  • 为一个复杂的子系统提供一个简单接口,对外隐藏子系统的具体实现、隔离变化。
  • 使用外观模式可以将一个子系统和使用它的客户端以及其它的子系统分离开来,这就提高了子系统的独立性和可移植性。
  • 在构建一个层次化结构的时候,可以使用外观模式定义每一个层次对外交互的接口。这样,层与层之间只需要通过外观进行通信,从而简化层与层之间的依赖关系。

4.实现

我们玩游戏时一般都有登录和充值等操作,这些一般都是第三方SDK来完成。游戏研发一般只需进行简单的接入就可以使用登录充值功能了。我们来实现一个简单的游戏SDK:

4.1 创建外观角色

这里只要是封装游戏SDK对外的接口,供游戏去研发去调用。这里只有两个接口:登录和充值。

    public class GameSdk {
        public void login() {//登录接口
            //调用登录子系统的接口
            LoginManager loginManager = new LoginManager();
            loginManager.login();
        }

        public void pay(int momey) {//支付接口
            //调用支付子系统的接口
            PayManager payManager = new PayManager();
            payManager.pay(momey);
        }
    }

4.2 子系统

    //登录系统
    public class LoginManager {
        public void login() {
            System.out.println("打开登录界面");
            System.out.println("进行登录操作");
            System.out.println("登录成功");
        }
    }
    //支付系统
    public class PayManager {
        public void pay(int momey) {
            System.out.println("生成订单信息");
            System.out.println("选择支付方式");
            System.out.println("支付成功:" + momey + "元");
        }
    }

4.3 客户端测试:

     private void test() {
        //这里是游戏研发,通过调用login()和pay()就能调起登录和支付,无需关心支付是使用支付宝还是威信等,这是游戏SDK里面去做的事。
        GameSdk gameSdk = new GameSdk();
        gameSdk.login();
        gameSdk.pay(6);
    }

输出结果:

打开登录界面
进行登录操作
登录成功
生成订单信息
选择支付方式
支付成功:6

5. 优点

  • 降低了客户端与子系统类的耦合度,实现了子系统与客户之间的松耦合关系。
  • 外观类对子系统的接口封装,使得系统更易于使用。
  • 提高灵活性,不管子系统如何变化,只要不影响门面对象,就可以*修改。

6. 缺点

  • 增加新的子系统可能需要修改外观类的源代码,违背了“开闭原则”。
  • 所有子系统的功能都通过一个接口来提供,这个接口可能会变得很复杂。

7. Android中的源码分析

外观模式在Android中应用也非常广泛,比如Context类,里面封装了很多方法,还是以startActivity()方法为例。实际上startActivity()是通过ActivityManagerService来实现的,ActivityManagerService我们应该都有耳闻,但是实际开发中一般都用不到,通过封装的方式,Context类隐藏了这些细节,我们只要简单调个方法就可以启动一个新的Activity
这就是外观模式在Android应用的例子了。当然这种应用比比皆是,我们平时开发也经常用的到。