设计模式讲解与代码实践(十一)——外观

本文来自李明子csdn博客(http://blog.csdn.net/free1985),商业转载请联系博主获得授权,非商业转载请注明出处!

1 目的

外观(Facade)定义了一个高层接口,为各子模块提供统一的对外视图。

2 基本形态

外观的基本形态如类图2-1所示。
图2-1  外观类图
图2-1 外观类图

3 参与者

结合图2-1,下面介绍各类在外观设计模式中扮演的角色。
3.1 Facade
Façade是外观。它是一个高层接口,为各子模块提供统一的对外视图。在Facade的各方法内部实现中,实例化相应的子模块,调用其对应的方法。
3.2 SubSystem
SubSystem是子系统。它们是真正实现业务功能的类。

4 代码实践

下面我们用一个业务场景实例来进一步讲解外观的使用。
4.1 场景介绍
某HR系统包含用户管理和组织机构管理的相关功能。为了与第三方系统集成,该系统开放了API,提供添加用户和添加组织机构等接口方法。
以下各节将介绍该场景各类的具体实现及其在外观设计模式中所对应的参与者角色。
4.2 UserMgmtService
UserMgmtService,即用户管理服务,是HR系统对外部系统开放的API入口。对应于外观模式的参与者,UserMgmtService是外观Facade。下面的代码给出了UserMgmtService的声明。

package demo.designpattern.facade;


/**
 * 用户管理服务
 * Created by LiMingzi on 2017/7/21.
 */
public class UserMgmtService {
    /**
     * 添加用户
     * @param id 用户id
     * @param name 用户名
     */
    public void addUser(String id,String name){
        // 用户管理对象
        UserMgmt userMgmt = new UserMgmt();
        userMgmt.add(id,name);
    }

    /**
     * 添加组织机构
     * @param id 组织机构id
     * @param name 组织机构名
     */
    public void addOrg(String id,String name){
        // 组织机构管理对象
        OrgMgmt orgMgmt = new OrgMgmt();
        orgMgmt.add(id,name);
    }
}

从上面代码可以看出,UserMgmtService的各接口实现中会实例化对应的类,并调用其方法。
4.3 UserMgmt
UserMgmt是用户管理类,提供了用户新增功能。对应于外观模式的参与者,UserMgmt是子系统SubSystem。下面的代码给出了UserMgmt的声明。

package demo.designpattern.facade;

/**
 * 用户管理类
 * Created by LiMingzi on 2017/7/21.
 */
public class UserMgmt {
    /**
     * 添加用户
     * @param id 用户id
     * @param name 用户名
     */
    public void add(String id,String name){
        System.out.println("用户'"+name+"'已成功添加");
    }
}

4.4 OrgMgmt
OrgMgmt是组织机构管理类,提供了组织机构新增功能。对应于外观模式的参与者,OrgMgmt是子系统SubSystem。下面的代码给出了OrgMgmt的声明。

package demo.designpattern.facade;

/**
 * 组织机构管理类
 * Created by LiMingzi on 2017/7/21.
 */
public class OrgMgmt {
    /**
     * 添加组织机构
     * @param id 组织机构id
     * @param name 组织机构名
     */
    public void add(String id,String name){
        System.out.println("组织'"+name+"'已成功添加");
    }
}

4.5 测试代码
为了测试本文中的代码,我们可以编写如下测试代码。我们只需要实例化UserMgmtService一个类,即可使用HR系统提供的API,不需要了解HR系统的内部类结构。

    /**
     * 外观测试
     */
    public static void facadeTest(){
        // 用户管理服务
        UserMgmtService userMgmtService = new UserMgmtService();
        userMgmtService.addUser("001","张三");
        userMgmtService.addOrg("001","财务部");
    }

编译运行后,得到如下测试结果:
用户’张三’已成功添加
组织’财务部’已成功添加

5 扩展

5.1 应用场景
外观设计模式在设计API接口时是经常被使用的。关于API接口的设计会在日后开辟专题讲解。在此,仅强调三点在使用外观模式时的注意事项:

  1. 各方法应尽可能做到上下文无关;
  2. 方法间应保持松散耦合;
  3. 接口方法参数应尽可能使用基本数据类型,避免出现对象类型;

5.2 大繁至简
外观设计模式从类层次结构上看非常简单,甚至过于简单,因此常常被人忽略。其实,外观设计模式所表达的设计思想对现实是有极大的指导性作用的。
上个月,我们的工作流供应商来公司介绍新版本产品。我们发现它的API从之前的多个服务接口缩减为一个,同时将各接口方法进一步解耦,并去掉了使用频率较低的接口方法。这种改变极大的提高了API的可用性,降低了学习、使用成本。而这正是外观设计模式的核心思想。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值