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

 更新时间:2016年10月18日 10:39:41   作者:翡青  
这篇文章主要为大家详细介绍了java设计模式之外观模式学习笔记,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

外观模式: 又称门面模式: 外观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 深入探究讲解工厂方法模式

    工厂方法模式(FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂、具体工厂、抽象产品、具体产品
    2022-04-04
  • springboot启动类如何剔除扫描某个包

    springboot启动类如何剔除扫描某个包

    这篇文章主要介绍了springboot启动类如何剔除扫描某个包,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • springboot 实现记录业务日志和异常业务日志的操作

    springboot 实现记录业务日志和异常业务日志的操作

    这篇文章主要介绍了springboot 实现记录业务日志和异常业务日志的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 在Spring Boot中如何使用Cookies详析

    在Spring Boot中如何使用Cookies详析

    这篇文章主要给大家介绍了关于在Spring Boot中如何使用Cookies的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • java 最新Xss攻击与防护(全方位360°详解)

    java 最新Xss攻击与防护(全方位360°详解)

    这篇文章主要介绍了java 最新Xss攻击与防护(全方位360°详解),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • SpringBoot中如何进行全局异常处理方式

    SpringBoot中如何进行全局异常处理方式

    在SpringBoot开发过程中,全局异常处理能提高程序的鲁棒性并降低代码耦合,通过使用@RestControllerAdvice和@ExceptionHandler注解,可以实现对程序异常的全局拦截和处理,首先需要自定义一个继承自ResponseEntityExceptionHandler的异常处理类
    2024-11-11
  • java web SpringMVC后端传json数据到前端页面实例代码

    java web SpringMVC后端传json数据到前端页面实例代码

    本篇文章主要介绍了java web SpringMVC后端传json数据到前端页面实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • SpringBoot如何读取Resource下的文件

    SpringBoot如何读取Resource下的文件

    这篇文章主要介绍了SpringBoot如何读取Resource下的文件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Java设计模式之单例模式简单解析

    Java设计模式之单例模式简单解析

    这篇文章主要介绍了Java设计模式之单例模式简单解析,单例模式的优点在于在内存中某个类只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例,避免对资源的多重暂用,需要的朋友可以参考下
    2023-12-12
  • Java中WeakHashMap的使用详解

    Java中WeakHashMap的使用详解

    这篇文章主要介绍了Java中WeakHashMap的使用详解,WeakHashMap是一种弱引用的Map,底层数据结构为数组链表,与HashMap相比,WeakHashMap的区别在于它的key存储为弱引用,在垃圾回收时,如果key没有被强引用所引用,那么key会被回收掉,需要的朋友可以参考下
    2023-09-09

最新评论