java设计模式之外观模式学习笔记

所属分类: 软件编程 / java 阅读数: 36
收藏 0 赞 0 分享

外观模式: 又称门面模式: 外观Facade为子系统的一组接口提供一个一致界面,使得这组子系统易于使用(通过引入一个新的外观角色降低原系统复杂度,同时降低客户类与子系统的耦合度).

图片来源: 设计模式: 可复用面向对象软件的基础.

实现

案例需求: 租房

有过自己找房租房经历的同学能够体会得到找房是件很痛苦的事, 不光要挨个小区跑而且还要跟(二)房东讨价还价. 于是后来学聪明了, 不再自己挨门挨户的磨嘴皮子, 而是直接找像链家、我爱我家这样的房屋中介, 他们手上握有一定的房源, 我们只需付给他们一笔佣金, 他们便可以代我们跟房东讲价, 而且他们大都很专业, 省时间又省钱. 此时房屋中介就是一个外观Facade, 而房屋的出租户就是子系统SubSystem:

Facade 
 外观类: 知道哪些子系统负责处理请求, 将客户的请求代理给适当的子系统对象:

public class MediumFacade {

  private CuiYuanApartment cuiyuan;

  private XiXiApartment xixi;

  private XiHuApartment xihu;

  public MediumFacade() {
    cuiyuan = new CuiYuanApartment("翠苑小区", 900, 1);
    xixi = new XiXiApartment("西溪花园", 1200, 1);
    xihu = new XiHuApartment("西湖小区", 2600, 1);
  }

  public void rentingHouse(double price) {
    // 价钱合适而且有房可组
    if (price >= cuiyuan.getPrice() && cuiyuan.getStatus() != 0) {
      System.out.println("预订" + cuiyuan.getLocation());
      cuiyuan.setStatus(0);
    } else if (price >= xixi.getPrice() && xixi.getStatus() != 0) {
      System.out.println("预订" + xixi.getLocation());
      xixi.setStatus(0);
    } else if (price >= xihu.getPrice() && xihu.getStatus() != 0) {
      System.out.println("预订" + xihu.getLocation());
      xihu.setStatus(0);
    } else {
      System.out.println("出价太低/没有房源 ...");
    }
  }
}

SubSystem 
 子系统集合: 实现子系统功能, 处理Facade对象指派的任务(注意子系统内没有任何Facade信息,即没有任何Facade对象引用):

/**
 * @author jifang
 * @since 16/8/23 上午10:12.
 */
public class XiHuApartment {

  private String location;

  private double price;

  private int status;

  public XiHuApartment(String location, double price, int status) {
    this.location = location;
    this.price = price;
    this.status = status;
  }

  public String getLocation() {
    return location;
  }

  public double getPrice() {
    return price;
  }

  public int getStatus() {
    return status;
  }

  public void setStatus(int status) {
    this.status = status;
  }
}

class XiXiApartment {
  private String location;

  private double price;

  private int status;

  public XiXiApartment(String location, double price, int status) {
    this.location = location;
    this.price = price;
    this.status = status;
  }

  public String getLocation() {
    return location;
  }

  public double getPrice() {
    return price;
  }

  public int getStatus() {
    return status;
  }

  public void setStatus(int status) {
    this.status = status;
  }
}

class CuiYuanApartment {

  private String location;

  private double price;

  private int status;

  public CuiYuanApartment(String location, double price, int status) {
    this.location = location;
    this.price = price;
    this.status = status;
  }

  public String getLocation() {
    return location;
  }

  public double getPrice() {
    return price;
  }

  public int getStatus() {
    return status;
  }

  public void setStatus(int status) {
    this.status = status;
  }
}

Client
这样, Client只需跟一个房屋中介联系并给出我们的报价, 他们便会帮我们联系所有符合的房东:

public class Client {

  @Test
  public void client() {
    MediumFacade facade = new MediumFacade();
    facade.rentingHouse(800);
  }
}

小结

有过面向对象开发经验的同学 即使没有听说过外观模式, 也完全有可能使用过他, 因为他完美的体现了依赖倒转原则和迪米特法则的思想, 是非常常用的模式之一.

使用 

 

首先 在设计初期, 应该有意识的进行层次分离, 比如经典的三层架构, 层与层之间建立Facade, 这样可以为复杂的子系统提供一个简单的接口, 使耦合度大大降低.

其次 在开发阶段, 子系统往往因为不断的重构而变得越来越复杂, 增加Facade可以提供一个简单的接口, 减少模块间依赖.

第三 在维护一个遗留系统时, 可能这个系统已经非常难以维护和扩展了, 但因为它包含非常重要的功能, 新的需求必须依赖它, 此时可以为新系统开发一个Facade, 为设计粗糙或高复杂度的遗留代码提供一个的比较清晰简单的接口, 让新系统与Facade交互, 而Facade与遗留代码交互所有繁杂的工作.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Java的面向对象编程基本概念学习笔记整理

这篇文章主要介绍了Java的面向对象编程基本概念学习笔记整理,包括类与方法以及多态等支持面向对象语言中的重要特点,需要的朋友可以参考下
收藏 0 赞 0 分享

Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法

这篇文章主要介绍了Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法 的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

基于Java实现杨辉三角 LeetCode Pascal's Triangle

这篇文章主要介绍了基于Java实现杨辉三角 LeetCode Pascal's Triangle的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Java中Spring获取bean方法小结

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢?下面通过本文给大家介绍Java中Spring获取bean方法小结,对spring获取bean方法相关知识感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

如何计算Java对象占用了多少空间?

在Java中没有sizeof运算符,所以没办法知道一个对象到底占用了多大的空间,但是在分配对象的时候会有一些基本的规则,我们根据这些规则大致能判断出来对象大小,需要的朋友可以参考下
收藏 0 赞 0 分享

剖析Java中的事件处理与异常处理机制

这篇文章主要介绍了Java中的事件处理与异常处理机制,讲解Java是如何对事件或者异常作出响应以及定义异常的一些方法,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Java的Struts2框架的结构及其数据转移方式

这篇文章主要介绍了详解Java的Struts2框架的结构及其数据转移方式,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

Java封装好的mail包发送电子邮件的类

本文给大家分享了2个java封装好的mail包发送电子邮件的类,并附上使用方法,小伙伴们可以根据自己的需求自由选择。
收藏 0 赞 0 分享

在Java的Struts中判断是否调用AJAX及用拦截器对其优化

这篇文章主要介绍了在Java的Struts中判断是否调用AJAX及用拦截器对其优化的方法,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

java多线程Future和Callable类示例分享

JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。今天我们就来研究下Future和Callab
收藏 0 赞 0 分享
查看更多