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

作者:翡青 时间:2022-07-02 18:48:06 

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

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

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

实现

案例需求: 租房

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

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

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);
 }
}

小结

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

使用 

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

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

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

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

标签:java,设计模式,外观模式
0
投稿

猜你喜欢

  • 浅谈java项目与javaweb项目导入jar包的区别

    2023-11-11 11:06:19
  • C语言字符串操作总结大全(超详细)

    2023-07-06 15:14:56
  • IDEA远程连接HBase及其Java API实战详解

    2023-11-27 21:54:46
  • java进阶解析Springboot上传excel存入数据库步骤

    2022-01-07 15:18:51
  • 一篇文章带你入门Java变量

    2021-09-21 07:46:02
  • java客户端登陆服务器用户名验证

    2023-11-09 07:03:09
  • Java调用CXF WebService接口的两种方式实例

    2023-11-09 02:25:11
  • Java 格式化输出JSON字符串的2种实现操作

    2023-11-13 09:41:10
  • Java BufferWriter写文件写不进去或缺失数据的解决

    2023-07-20 14:57:02
  • Java服务限流算法的6种实现

    2022-04-03 04:52:51
  • Android实现人脸支付的示例代码

    2023-07-30 14:23:52
  • Hibernate实现批量添加数据的方法

    2023-11-29 08:53:56
  • Java8之lambda最佳实践_动力节点Java学院整理

    2023-11-28 00:07:28
  • Jenkins+Maven+SVN自动化部署java项目

    2021-06-01 11:28:27
  • Java异常处理try catch的基本使用

    2023-11-24 05:04:38
  • 使用@pathvariable与@requestparam碰到的一些问题及解决

    2023-11-27 16:30:34
  • Java创建与结束线程代码示例

    2023-01-16 16:20:00
  • Flutter状态管理Bloc使用示例详解

    2023-08-24 09:09:10
  • 详解Struts2动态方法调用

    2022-10-18 11:19:25
  • java(jdk)环境变量配置(XP、win7、win8)图文教程详解

    2021-11-01 15:06:48
  • asp之家 软件编程 m.aspxhome.com