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

  我在学习这个外观模式的时候,多多少少还是有点熟悉感的。后来仔细想了想,其实这个模式我们很常用,比如我们所熟悉的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()方法来删除用户所有有关的信息。

类图

  画个类图简单来理解下上面示例的结构:
  Java设计模式之结构型模式-外观模式(Facade)_第1张图片

实现过程

  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. 简化操作,提高灵活性: 使用外观类,给复杂的遗留代码提供一个简单清晰的外部接口供外部使用,避免直接调用原有功能所导致客户程序的复杂化。

你可能感兴趣的:(设计模式)