java设计模式之外观模式学习笔记_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
, 设计模式
外观模式
,以便于您获取更多的相关知识。

时间: 2024-09-30 11:18:20

java设计模式之外观模式学习笔记_java的相关文章

Java设计模式之外观模式(Facade模式)介绍_java

外观模式(Facade)的定义:为子系统中的一组接口提供一个一致的界面. Facade一个典型应用就是数据库JDBC的应用,如下例对数据库的操作: 复制代码 代码如下: public class DBCompare { Connection conn = null; PreparedStatement prep = null; ResultSet rset = null; try { Class.forName( "<driver>" ).newInstance(); co

Java设计模式之策略模式详解_java

本文实例为大家分享了Java策略模式,供大家参考,具体内容如下 1.策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(PolicyPattern). 定义如下: Define a family of algorithms,encapsulate each one,and make them interchangeable.    (定义一组算法,将每个算法都封装起来,并且使它们之间可以互换.) 策略模式的通用类图如下所示: 策略模式的三个角色: ● Context

详解Java设计模式之备忘录模式的使用_java

定义与结构     备忘录(Memento)模式又称标记(Token)模式.GOF给备忘录模式的定义为:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 在讲命令模式的时候,我们曾经提到利用中间的命令角色可以实现undo.redo的功能.从定义可以看出备忘录模式是专门来存放对象历史状态的,这对于很好的实现undo.redo功能有很大的帮助.所以在命令模式中undo.redo功能可以配合备忘录模式来实现. 其实单就实现保存一个对

JAVA设计模式之访问者模式详解_java

在阎宏博士的<JAVA与模式>一书中开头是这样描述访问者(Visitor)模式的: 访问者模式是对象的行为模式.访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变. 分派的概念 变量被声明时的类型叫做变量的静态类型(Static Type),有些人又把静态类型叫做明显类型(Apparent Type):而变量所引用的对象的真实类型又叫做变量的实际类型(Actual Type).比如: 复制代码 代码如下: List lis

JAVA设计模式之解释器模式详解_java

在阎宏博士的<JAVA与模式>一书中开头是这样描述解释器(Interpreter)模式的: 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 解释器模式的结构 下面就以一个示意性的系统为例,讨论解释器模式的结构.系统的结构图如下所示: 模式所涉及的角色如下所示: (1)抽象表达式(Expression)角色:声明一个所有的具体表达式角色都需要实现的抽象接口.这个接口主要是一个interpre

PHP设计模式之工厂模式学习笔记

在大型系统中,许多代码依赖于少数几个关键类.需要更改这些类时,可能会出现困难.例如,假设您有一个从文件读取的 User 类.您希望将其更改为从数据库读取的其他类,但是,所有的代码都引用从文件读取的原始类.这时候,使用工厂模式会很方便. 工厂模式是一种类,它具有为您创建对象的某些方法.您可以使用工厂类创建对象,而不直接使用 new.这样,如果您想要更改所创建的对象类型,只需更改该工厂即可.使用该工厂的所有代码会自动更改. 示例1:显示工厂类的一个示列. 等式的服务器端包括两个部分:数据库和一组 P

设计模式:外观模式(Facade)

为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式又称门面模式. 外观模式的角色 1. 门面角色:客户端可以调用这个角色的方法.此角色知晓相关的(一个或者多个)子系统的功能和责任.在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去. 2. 子系统角色:可以同时有一个或者多个子系统.每个子系统都不是一个单独的类,而是一个类的集合.每个子系统都可以被刻度环直接调用,或者被门面角色调用.子系统并不知道门面的存在,对

java设计模式---prototype(原型)模式

设计 java设计模式---prototype(原型)模式 定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.      Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,      工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求      原型对象拷贝它们自己来实施创建.      适用性:当要实例化的类是在运行时刻指定时,例如,通过动态装载:或者  为了避免创建一个与产品类层次平行的工厂类层

浅谈Java设计模式关于原型模式(Prototype)思索建议

java教程:关于Java设计模式关于原型模式(Prototype) IT信息技术http://www.52ij.com/jishu/ 首先需要弄清楚什么叫原型模式,或者说为什么要有原型模式,运用它会给我们带来什么或能解决什么问题?原型模式(Prototype)同抽象工厂模式同属于创建型模式,它主要关注于大量相同或相似对象的创建问题,应用原型模式就是先需要一个原对象,然后通过对原对象进行复制(克隆),来产生一个与原对象相同或相似的新对象.注意这里所说的对象相同不是指复制出来的副本对象与原对象是同