设计模式——外观模式详解

0. 前言

写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦~

当我们开发Android的时候,无论是SDK还是封装API,我们在不经意之间就会使用到外观模式,它通过一个外观类使得整个系统的结构只有一个统一的高层接口,对用户屏蔽各个子功能系统的实现,从而可以降低用户的使用成本。

 

1. 外观模式模式介绍

外观模式定义:

外部与一个或多个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得子系统的调用更加方便。

 

外观模式的使用场景:

1)在开发阶段,子系统会因为不断的重构演化而变得越来越复杂或者被整体替换,这种易变性给外部调用它们的用户带来了使用上的困难,使用外观模式可以提供一个简单的接口,减少它们之间的依赖

2)如果完成一个功能需要子系统协调完成,可以通过外观接口屏蔽这个子系统之间的交互逻辑。否则用户在使用时容易出错。

 

外观模式包括的角色:


1Facade:外观类,系统对外的统一接口,将客户端的请求代理给相应的子系统对象。

2Subsystem:子系统类,实现子系统的功能,注意子系统类不含有外观类的引用。

 

2. 外观模式模式实例介绍

通过上面给出的角色类,我们可以实现一个简单的实例,电视遥控器是现实生活中一个比较好的外观模式的运用,遥控器(外观类)可以控制电源的开关(子系统A)、频道的切换(子系统B)等功能。遥控器统一对这些子模块的控制,而不是在用户使用时通过多个遥控器来分别完成上述功能。

下面我们就来通过外观模式模拟一下遥控器系统,代码也比较简单:

// 外观类
public class TvController {
    private PowerSystem mPowerSystem = new PowerSystem();
    private ChannelSystem mChannelSystem = new ChannelSystem();
    public void powerOn() {
        mPowerSystem.powerOn();
    }
    public void powerOff() {
        mPowerSystem.powerOff();
    }
    public void nextChannel() {
        mChannelSystem.next();
    }
    public void prevChannel() {
        mChannelSystem.prev();
    }
}

//子系统类
//电源子系统类
class PowerSystem {
    public void powerOn() {
        System.out.println("开机");
    }
    public void powerOff() {
        System.out.println("关机");
    }
}
//频道子系统类
class ChannelSystem {
    public void next() {
        System.out.println("下一频道");
    }
    public void prev() {
        System.out.println("上一频道");
    }
}

//使用时
TvController controller = new TvController();
controller. powerOn();
controller. nextChannel ();
controller. prevChannel ();
controller. powerOff();

//运行结果
开机
下一频道
上一频道
关机

从上面客户端的使用代码可以看出,外观模式从很大程度上提高了客户端使用的便捷性,使得客户端无须关心子系统的工作细节,通过外观类对象controller即可调用相关功能。

 

3. 外观模式的优点

1)对客户隐藏子系统细节,减少了客户与子系统之间的耦合,可以方便地应对子系统的变化。

2)毫无疑问方便了用户的使用。

原文地址:https://www.cnblogs.com/qitian1/p/6461461.html