Java设计模式之结构型模式-外观模式(Facade)

来源:互联网 发布:工行td交易软件 编辑:程序博客网 时间:2024/06/05 06:21

  我在学习这个外观模式的时候,多多少少还是有点熟悉感的。后来仔细想了想,其实这个模式我们很常用,比如我们所熟悉的MVC模式就运用到了这个外观模式。

外观模式: 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加的容易使用。

两个要素

   1. 外观类(Facade): 知道哪些子系统负责处理请求,并将客户的请求代理给适当的子系统对象。
   2. 子系统类集合(SubSystem Classes): 实现子系统的具体功能,处理由Facade对象指派过来的任务。不具备对Facade对象的任何引用。

示例

  使用过MVC模式都应该清楚MVC模式将整个系统分成了Controller、Service、Dao三个层次。这里我们先一一对应下,Controller层就好比我们的客户端,Service层则好比我们的外观类(Facade),而Dao层就相当于我们的子系统类集合(SubSystem Classes)。
  这个举个例子来讲。比如我们这里有一个小系统,拥有User、Daily和Photo三张表,分别用来存储用户基本信息,用户的日志和用户的照片。同时用UserDao、DailyDao、PhotoDao来对应操作张三表,并用UserService中的deleteUserAllInfo()方法来删除用户所有有关的信息。

类图

  画个类图简单来理解下上面示例的结构:
  

实现过程

  1. 创建子系统类 UserDao、DailyDao和PhotoDao。这里不考虑Dao层对具体表的操作,仅仅用简单的输出作为具体的实现。

public class UserDao {    public void deleteUser(String userName) {        System.out.println(userName + " 用户基本信息删除成功...");    }}
public class DailyDao {    public void deleteDaily(String userName) {        System.out.println(userName + " 用户相关日志删除成功...");    }}
public class PhotoDao {    public void deletePhoto(String userName) {        System.out.println(userName + " 用户相关照片删除成功...");    }}

  2. 创建外观类 UserService,了解所有子系统的方法或者属性,进行组合,以备客户端的调用。这里提供deleteUserAllInfo这个方法,主要用来删除用户相关的所有的信息。

public class UserService {    UserDao userDao;    DailyDao dailyDao;    PhotoDao photoDao;    public UserService() {        userDao = new UserDao();        dailyDao = new DailyDao();        photoDao = new PhotoDao();    }    public void deleteUserAllInfo(String userName) {        userDao.deleteUser(userName);        dailyDao.deleteDaily(userName);        photoDao.deletePhoto(userName);    }}

  3. 创建客户端测试类 Controller

public class Controller {    public static void main(String[] args) {        UserService userService = new UserService();        userService.deleteUserAllInfo("赵海豪");    }}

运行的结果如下:

赵海豪 用户基本信息删除成功...赵海豪 用户相关日志删除成功...赵海豪 用户相关照片删除成功...

优点

  1. 解耦: 增加外观类Facade类可以提供一个简单接口,减少客户端和子系统之间的依赖。上述代码相当于为复杂的dao层提供了一个简单的接口,从而使得Controller层和Dao层之间的耦合性大大的降低。
  2. 简化操作,提高灵活性: 使用外观类,给复杂的遗留代码提供一个简单清晰的外部接口供外部使用,避免直接调用原有功能所导致客户程序的复杂化。