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

来源:互联网 发布:ubuntu sd卡挂载 编辑:程序博客网 时间:2024/05/17 17:43

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)毫无疑问方便了用户的使用。

1 0
原创粉丝点击