盘锦市建设局网站地址,在线教育网站模板,做网站seo怎么赚钱,最大源码网站文章目录 1 外观模式#xff08;Facade Pattern#xff09;1.1 介绍1.2 概述1.3 外观模式的结构 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 jdk源码解析 #x1f64a; 前言#xff1a;本文章为瑞_系列专栏之《23种设计模式》的外观模式篇。本文中的部分… 文章目录 1 外观模式Facade Pattern1.1 介绍1.2 概述1.3 外观模式的结构 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 jdk源码解析 前言本文章为瑞_系列专栏之《23种设计模式》的外观模式篇。本文中的部分图和概念等资料来源于博主学习设计模式的相关网站《菜鸟教程 | 设计模式》和《黑马程序员Java设计模式详解》特此注明。本文中涉及到的软件设计模式的概念、背景、优点、分类、以及UML图的基本知识和设计模式的6大法则等知识建议阅读 《瑞_23种设计模式_概述》 本系列 - 设计模式 - 链接《瑞_23种设计模式_概述》 ⬇️本系列 - 创建型模式 - 链接 单例模式《瑞_23种设计模式_单例模式》 工厂模式《瑞_23种设计模式_工厂模式》 原型模式《瑞_23种设计模式_原型模式》 抽象工厂模式《瑞_23种设计模式_抽象工厂模式》 建造者模式《瑞_23种设计模式_建造者模式》 ⬇️本系列 - 结构型模式 - 链接 代理模式《瑞_23种设计模式_代理模式》 适配器模式《瑞_23种设计模式_适配器模式》 装饰者模式《瑞_23种设计模式_装饰者模式》 桥接模式《瑞_23种设计模式_桥接模式》 外观模式《后续更新》 组合模式《后续更新》 享元模式《后续更新》 ⬇️本系列 - 行为型模式 - 链接 模板方法模式《后续更新》 策略模式《后续更新》 命令模式《后续更新》 职责链模式《后续更新》 状态模式《后续更新》 观察者模式《后续更新》 中介者模式《后续更新》 迭代器模式《后续更新》 访问者模式《后续更新》 备忘录模式《后续更新》 解释器模式《后续更新》 1 外观模式Facade Pattern 外观模式Facade Pattern隐藏系统的复杂性并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式它向现有的系统添加一个接口来隐藏系统的复杂性。 瑞结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式前者采用继承机制来组织接口和类后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低满足“合成复用原则”所以对象结构型模式比类结构型模式具有更大的灵活性。 这种模式涉及到一个单一的类该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。
1.1 介绍 意图为子系统中的一组接口提供一个一致的界面外观模式定义了一个高层接口这个接口使得这一子系统更加容易使用。 主要解决降低访问复杂系统的内部子系统时的复杂度简化客户端之间的接口。 何时使用 1️⃣ 客户端不需要知道系统内部的复杂联系整个系统只需提供一个接待员即可。 2️⃣ 定义系统的入口。 如何解决客户端不与系统耦合外观类与系统耦合。 关键代码在客户端和复杂系统之间再加一层这一层将调用顺序、依赖关系等处理好。 应用实例 1️⃣ 去医院看病可能要去挂号、门诊、划价、取药让患者或患者家属觉得很复杂如果有提供接待人员只让接待人员来处理就很方便。 2️⃣ JAVA 的三层开发模式。 瑞JAVA的三层开发模式通常指的是将应用程序划分为三个主要部分表示层Presentation Layer、业务逻辑层Business Logic Layer和数据访问层Data Access Layer 优点 1️⃣ 减少系统相互依赖。 2️⃣ 提高灵活性。 3️⃣ 提高了安全性。 缺点不符合开闭原则如果要改东西很麻烦继承重写都不合适。 使用场景 1️⃣ 为复杂的模块或子系统提供外界访问的模块。 2️⃣ 子系统相对独立。 3️⃣ 预防低水平人员带来的风险。 注意事项在层次化结构中可以使用外观模式定义系统中每一层的入口。
1.2 概述 定义又名门面模式是一种通过为多个复杂的子系统提供一个一致的接口而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口外部应用程序不用关心内部子系统的具体的细节这样会大大降低应用程序的复杂度提高了程序的可维护性。 有些人可能炒过股票但其实大部分人都不太懂这种没有足够了解证券知识的情况下做股票是很容易亏钱的刚开始炒股肯定都会想如果有个懂行的帮帮手就好其实基金就是个好帮手支付宝里就有许多的基金它将投资者分散的资金集中起来交由专业的经理人进行管理投资于股票、债券、外汇等领域而基金投资的收益归持有者所有管理机构收取一定比例的托管管理费用。 瑞外观模式是“迪米特法则”的典型应用。迪米特法则是指一个实体应当尽量少地与其他实体之间发生相互作用使得系统功能模块相对独立 外观Facade模式用图片描述如下 1.3 外观模式的结构
外观Facade模式包含以下主要角色 1️⃣ 外观Facade角色为多个子系统对外提供一个共同的接口。 2️⃣ 子系统Sub System角色实现系统的部分功能客户可以通过外观角色访问它。 2 案例一 【案例】智能家电控制 2.1 需求 小明的爷爷已经60岁了一个人在家生活每次都需要打开灯、打开电视、打开空调睡觉时关闭灯、关闭电视、关闭空调操作起来都比较麻烦。所以小明给爷爷买了智能音箱可以通过语音直接控制这些智能家电的开启和关闭。类图如下 2.2 代码实现
电灯类类 /*** 电灯类** author LiaoYuXing-Ray**/
public class Light {//开灯public void on() {System.out.println(打开电灯。。。。);}//关灯public void off() {System.out.println(关闭电灯。。。。);}
}电视机类类 /*** 电视机类** author LiaoYuXing-Ray**/
public class TV {public void on() {System.out.println(打开电视机。。。。);}public void off() {System.out.println(关闭电视机。。。。);}
}
空调类类 /*** 空调类** author LiaoYuXing-Ray**/
public class AirCondition {public void on() {System.out.println(打开空调。。。。);}public void off() {System.out.println(关闭空调。。。。);}
}
外观类类 /*** 外观类用户主要和该类对象进行交互** author LiaoYuXing-Ray**/
public class SmartAppliancesFacade {// 聚合电灯对象电视机对象空调对象private final Light light;private final TV tv;private final AirCondition airCondition;public SmartAppliancesFacade() {light new Light();tv new TV();airCondition new AirCondition();}// 通过语言控制public void say(String message) {if(message.contains(打开)) {on();} else if(message.contains(关闭)) {off();} else {System.out.println(我还听不懂你说的);}}// 一键打开功能private void on() {light.on();tv.on();airCondition.on();}// 一键关闭功能private void off() {light.off();tv.off();airCondition.off();}
}
测试类 /*** 测试类** author LiaoYuXing-Ray**/
public class Client {public static void main(String[] args) {// 创建智能音箱对象SmartAppliancesFacade facade new SmartAppliancesFacade();// 控制家电facade.say(打开家电);System.out.println();facade.say(关闭家电);}
}代码运行结果如下 打开电灯。。。。打开电视机。。。。打开空调。。。。关闭电灯。。。。关闭电视机。。。。关闭空调。。。。好处
降低了子系统与客户端之间的耦合度使得子系统的变化不会影响调用它的客户类。对客户屏蔽了子系统组件减少了客户处理的对象数目并使得子系统使用起来更加容易。
缺点
不符合开闭原则修改很麻烦
使用场景
对分层结构系统构建时使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。当一个复杂系统的子系统很多时外观模式可以为系统设计一个简单的接口供外界访问。当客户端与多个子系统之间存在很大的联系时引入外观模式可将它们分离从而提高子系统的独立性和可移植性。 3 案例二 本案例为菜鸟教程中的案例 3.1 需求 我们将创建一个 Shape 接口和实现了 Shape 接口的实体类。下一步是定义一个外观类 ShapeMaker。 ShapeMaker 类使用实体类来代表用户对这些类的调用。FacadePatternDemo 类使用 ShapeMaker 类来显示结果。 3.2 代码实现 步骤 1 创建一个接口。
Shape.java public interface Shape {void draw();
}步骤 2 创建实现接口的实体类。
Rectangle.java public class Rectangle implements Shape {Overridepublic void draw() {System.out.println(Rectangle::draw());}
}Square.java public class Square implements Shape {Overridepublic void draw() {System.out.println(Square::draw());}
}Circle.java public class Circle implements Shape {Overridepublic void draw() {System.out.println(Circle::draw());}
}步骤 3 创建一个外观类。
ShapeMaker.java public class ShapeMaker {private Shape circle;private Shape rectangle;private Shape square;public ShapeMaker() {circle new Circle();rectangle new Rectangle();square new Square();}public void drawCircle(){circle.draw();}public void drawRectangle(){rectangle.draw();}public void drawSquare(){square.draw();}
}步骤 4 使用该外观类画出各种类型的形状。
FacadePatternDemo.java public class FacadePatternDemo {public static void main(String[] args) {ShapeMaker shapeMaker new ShapeMaker();shapeMaker.drawCircle();shapeMaker.drawRectangle();shapeMaker.drawSquare(); }
}步骤 5 执行程序输出结果 Circle::draw()Rectangle::draw()Square::draw()4 jdk源码解析 使用 tomcat 作为 web 容器时接收浏览器发送过来的请求tomcat 会将请求信息封装成 ServletRequest 对象如下图①处对象。但是大家想想 ServletRequest 是一个接口它还有一个子接口 HttpServletRequest 而我们知道该 request 对象肯定是一个 HttpServletRequest 对象的子实现类对象到底是哪个类的对象呢可以通过输出 request 对象我们就会发现是一个名为 RequestFacade 的类的对象。 RequestFacade类就使用了外观模式。先看结构图 RequestFacade类使用外观模式的原因定义 RequestFacade 类分别实现 ServletRequest 同时定义私有成员变量 Request 并且方法的实现调用 Request 的实现。然后将 RequestFacade上转为 ServletRequest 传给 servlet 的 service 方法这样即使在 servlet 中被下转为 RequestFacade 也不能访问私有成员变量对象中的方法。既用了 Request 又能防止其中方法被不合理的访问。 本文是博主的粗浅理解可能存在一些错误或不完善之处如有遗漏或错误欢迎各位补充谢谢 如果觉得这篇文章对您有所帮助的话请动动小手点波关注你的点赞收藏⭐️转发评论都是对博主最好的支持~