0. 前言
写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦~
当我们开发Android的时候,无论是做SDK还是封装API,我们在不经意之间就会使用到外观模式,它通过一个外观类使得整个系统的结构只有一个统一的高层接口,对用户屏蔽各个子功能系统的实现,从而可以降低用户的使用成本。
1. 外观模式模式介绍
外观模式定义:
外部与一个或多个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得子系统的调用更加方便。
外观模式的使用场景:
(1)在开发阶段,子系统会因为不断的重构演化而变得越来越复杂,或者被整体替换,这种易变性给外部调用它们的用户带来了使用上的困难,使用外观模式可以提供一个简单的接口,减少它们之间的依赖。
(2)如果完成一个功能需要子系统协调完成,可以通过外观接口屏蔽这个子系统之间的交互逻辑。否则用户在使用时容易出错。
外观模式包括的角色:
(1)Facade:外观类,系统对外的统一接口,将客户端的请求代理给相应的子系统对象。
(2)Subsystem:子系统类,实现子系统的功能,注意子系统类不含有外观类的引用。
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)毫无疑问方便了用户的使用。