java设计模式之外观模式学习笔记
作者:翡青 发布时间:2022-07-02 18:48:06
外观模式: 又称门面模式: 外观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与遗留代码交互所有繁杂的工作.
猜你喜欢
- 一、创建支付宝沙箱跳转 : 支付宝沙箱平台1、进入控制台2、创建小程序,编写名称和绑定商家即可3、返回第一个页面,往下滑进入沙箱4、进行相关
- 本篇将从以下几个方面讲述反射的知识:class 的使用方法的反射构造函数的反射成员变量的反射一、什么是class类在面向对象的世界里,万物皆
- java 进制转换实例详解十进制转成十六进制:  
- OverView今天在复习的时候,突然复习到我们的相机操作,但是对于相机操作,对于我来说比较复杂的是对于权限的操作。所有我们需要对我们的相机
- 1、静态代码块①、格式在java类中(方法中不能存在静态代码块)使用static关键字和{}声明的代码块:public class Code
- 一、平衡二叉树的定义平衡二叉树是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1 。它是一种高度平衡的二叉排序树。意思是说,
- IDEA快速搭建spring boot项目1.创建项目老规矩,点击Create New Project2.编写控制器在com.demo.sp
- java Mybatis存进时间戳封装了一个实体类,里面有个字段 Integer createTime。要利用这个实体类将一个时间戳存进数据
- 提示:IntelliJ IDEA以下简称IDEA;####IntelliJ IDEA 配置git:需要的材料:一、git.exe二、配置gi
- 本文实例为大家分享了java读取cvs文件并导入数据库的具体代码,供大家参考,具体内容如下首先获取文件夹下面的所有类型相同的excel,可以
- springboot上传文件大小的配置我这里记录两种,一种是设置在配置文件里只有两行代码,一种是加个Bean首先第一种:applicatio
- java.util.Arrays类能方便地操作数组,它提供的所有方法都是静态的。静态方法是属于类的,不是属于类的对象。所以可以直接使用类名加
- Gson是一个Java库,用来实现Json和Java对象之间的相互转换。Gson是一个托管在https://github.com/googl
- 在POI的使用过程中,对大多数API User来说经常面临两个问题,这也是GridExcel致力解决的问题。问题1. 仅使用简单的导入导出功
- 加载本地图片在项目目录下创建assets文件夹,再在其文件夹下创建images文件夹,后面将需要的图片复制到其中即可在pubspec.yam
- 目录Spring自动注入失败如何解决?回答注入你的bean使用@Configurable手动查找bean:不推荐Spring自动注入失败如何
- 1.多数据源配置类整体项目结构1).pom.xml 项目依赖<?xml version="1.0" encodin
- 序列化与反序列化序列化:把对象转换成字节的过程,称为对象序列化反序列化:把字节恢复成对象的过程,称为反序列化对象的持久化概念:把字节保存的硬
- 什么是深度优先什么是深度,即向下,深度优先,即向下优先,一口气走到底,走到底发现没路再往回走。在算法实现上来讲,深度优先可以考虑是递归的代名
- 简介本文介绍MyBatis-Plus的分页的方法。包括:不传参数时的默认结果查询不存在的数据手动包装page自定义SQL建库建表DROP D