外观设计模式
一、外观设计模式
1、介绍
- 外观模式(Facade),也叫“过程模式”。
- 外观模式定义了一个高层接口,用以屏蔽内部子系统的细节,使得客户端只需跟这个接口发生调用,而无需关心这个子系统的内部细节。简化了客户端操作。
2、UML原理类图
外观类(Facade):为客户端提供统一的调用接口,外观类知道哪些子系统负责处理请求,从而将客户端的请求代理给适当子系统对象
客户端(调用者):外观接口的调用者
子系统集合:指模块或者子系统,处理Facade对象指派的任务,功能的实际提供者
3、外观模式的使用
(1)外观模式对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性
(2)外观模式是对客户端与子系统之间的耦合关系达到解耦的目的,让子系统内部的模块更容易维护和扩展
(3)通过合理的使用外观模式,可以帮助我们更好的划分访问的层次
(4)当系统需要进行分成设计时,可以考虑使用Facade模式

(5)在维护一个遗留的大型系统时,可能这个系统已经变得非常难以维护和扩展,此时可以考虑为新系统开发一个Facade类,来提供遗留系统中比较清晰简单的接口,让新系统与Facade类交互,提高复用性
(6)不能过多或者不合理的使用外观模式。无论是使用外观模式,还是直接调用模块,要让系统有层次,利于维护为主要目的。
二、普通方式编程
1、介绍
(1)需求
智能家居建设,早上起床前30分钟,定时器执行命令,控制家中的智能家居执行以下步骤:
开启热水器
开启空调
开启咖啡机
30分钟后(起床)
开启灯光
播放新闻
放洗澡水-拿咖啡-洗澡
出门关闭各种设备
(2)弊端
- 在Client的main方法中,创建了各个子系统(智能家居)的对象,并直接调用子系统(对象)相关方法,对于Client来说,这样会造成调用过程混乱,没有清晰的过程
- 不利于在Client中,去维护对子系统(智能家居)的操作
2、UML

3、代码
/ * @description: 热水器 * @author: dashu * @create: 14:38 */ public class WaterHeater {
public void on(){
System.out.println("打开热水器"); } public void off(){
System.out.println("关闭热水器"); } }
讯享网
讯享网/ * @description: 空调 * @author: dashu * @create: 14:39 */ public class AirConditioner {
public void on(){
System.out.println("打开空调"); } public void off(){
System.out.println("关闭空调"); } }
/ * @description: 咖啡机 * @author: dashu * @create: 14:40 */ public class CoffeeMaker {
public void on(){
System.out.println("打开咖啡机"); } public void off(){
System.out.println("关闭咖啡机"); } }
讯享网/ * @description: 灯光 * @author: dashu * @create: 14:43 */ public class Lamplight {
public void on(){
System.out.println("打开灯光"); } public void off(){
System.out.println("关闭灯光"); } }
/ * @description: 新闻 * @author: dashu * @create: 14:44 */ public class Journalism {
public void on(){
System.out.println("打开新闻"); } public void off(){
System.out.println("关闭新闻"); } }
讯享网/ * @description: 客户端 * @author: dashu * @create: 14:24 */ public class Client {
/ * 智能家居 * 1、早上起床前30分钟,定时器执行命令,控制家中的智能家居执行以下步骤: * 开启热水器 * 开启空调 * 开启咖啡机 * 30分钟后(起床) * 开启灯光 * 播放新闻 * 放洗澡水-拿咖啡-洗澡 * 出门关闭各种设备 */ public static void main(String[] args) {
System.out.println("---起床前30分钟---"); WaterHeater waterHeater = new WaterHeater(); waterHeater.on(); AirConditioner airConditioner = new AirConditioner(); airConditioner.on(); CoffeeMaker coffeeMaker = new CoffeeMaker(); coffeeMaker.on(); Lamplight lamplight = new Lamplight(); lamplight.on(); Journalism journalism = new Journalism(); journalism.on(); System.out.println("---起床---"); System.out.println("放洗澡水-拿咖啡-洗澡"); System.out.println("---出门---"); waterHeater.off(); airConditioner.off(); coffeeMaker.off(); lamplight.off(); journalism.off(); } }
二、外观设计模式编程
1、介绍
外观模式可以理解为转换一群接口,客户端只需要调用一个接口,而不用调用多个接口才能达到目的
外观模式就是解决多个复杂接口带来的使用困难,起到简化用户操作的作用
2、UML

3、代码
/ * @description: 热水器 * @author: dashu * @create: 14:38 */ public class WaterHeater {
private static WaterHeater waterHeater = new WaterHeater(); private WaterHeater() {
} public static WaterHeater instance(){
return waterHeater; } public void on(){
System.out.println("打开热水器"); } public void off(){
System.out.println("关闭热水器"); } }
讯享网/ * @description: 空调 * @author: dashu * @create: 14:39 */ public class AirConditioner {
private static AirConditioner airConditioner = new AirConditioner(); private AirConditioner() {
} public static AirConditioner instance(){
return airConditioner; } public void on(){
System.out.println("打开空调"); } public void off(){
System.out.println("关闭空调"); } }
/ * @description: 咖啡机 * @author: dashu * @create: 14:40 */ public class CoffeeMaker {
private static CoffeeMaker coffeeMaker = new CoffeeMaker(); private CoffeeMaker() {
} public static CoffeeMaker instance(){
return coffeeMaker; } public void on(){
System.out.println("打开咖啡机"); } public void off(){
System.out.println("关闭咖啡机"); } }
讯享网/ * @description: 灯光 * @author: dashu * @create: 14:43 */ public class Lamplight {
private static Lamplight lamplight = new Lamplight(); private Lamplight() {
} public static Lamplight instance(){
return lamplight; } public void on(){
System.out.println("打开灯光"); } public void off(){
System.out.println("关闭灯光"); } }
/ * @description: 新闻 * @author: dashu * @create: 14:44 */ public class Journalism {
private static Journalism journalism = new Journalism(); private Journalism() {
} public static Journalism instance(){
return journalism; } public void on(){
System.out.println("打开新闻"); } public void off(){
System.out.println("关闭新闻"); } }
讯享网/ * @description: 智能家居外观者模式 * @author: dashu * @create: 14:56 */ public class SmartHomeFacade {
private WaterHeater waterHeater; private AirConditioner airConditioner; private CoffeeMaker coffeeMaker; private Lamplight lamplight; private Journalism journalism; public SmartHomeFacade(){
this.waterHeater = WaterHeater.instance(); this.airConditioner = AirConditioner.instance(); this.coffeeMaker = CoffeeMaker.instance(); this.lamplight = Lamplight.instance(); this.journalism = Journalism.instance(); } / * 开启 */ public void on(){
waterHeater.on(); airConditioner.on(); coffeeMaker.on(); lamplight.on(); journalism.on(); } / * 关闭 */ public void off(){
waterHeater.off(); airConditioner.off(); coffeeMaker.off(); lamplight.off(); journalism.off(); } }
/ * @description: 客户端 * @author: dashu * @create: 15:04 */ public class Client {
/ * 智能家居 * 1、早上起床前30分钟,定时器执行命令,控制家中的智能家居执行以下步骤: * 开启热水器 * 开启空调 * 开启咖啡机 * 30分钟后(起床) * 开启灯光 * 播放新闻 * 放洗澡水-拿咖啡-洗澡 * 出门关闭各种设备 */ public static void main(String[] args) {
System.out.println("---起床前30分钟---"); SmartHomeFacade smartHomeFacade = new SmartHomeFacade(); smartHomeFacade.on(); System.out.println("---起床---"); System.out.println("放洗澡水-拿咖啡-洗澡"); System.out.println("---出门---"); smartHomeFacade.off(); } }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/35353.html