Java设计模式之结构型:外观模式

Java设计模式之结构型:外观模式

一、什么是外观模式:

        外观模式通过对客户端提供一个统一的接口,用于访问子系统中的一群接口。使用外观模式有以下几点好处:

(1)更加易用:使得子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟外观类交互就可以了;

(2)松散耦合:将客户端与子系统解耦,让子系统内部的模块能更容易扩展和维护。

(3)更好的划分访问层次:通过合理使用 Facade,可以更好地划分访问的层次,有些方法是对系统外的,有些方法是系统内部使用的。把需要暴露给外部的功能集中到门面中,这样既方便客户端使用,也很好地隐藏了内部的细节。

        但是如果外观模式对子系统类做太多的限制则减少了可变性和灵活性,所以外观模式适用于为复杂子系统提供一个简单接口,提高系统的易用性场景 以及 引入外观模式将子系统与客户端进行解耦,提高子系统的独立性和可移植性。

Java设计模式之结构型:外观模式

        如上图,引入外观模式后,子系统的使用变得更加简单,客户只需要与 Facede 外观角色打交道,子系统间的复杂关系由外观角色来实现,从而降低了系统的耦合度。如果没有 Facade 类,那么 Subsystem 之间将会相互持有对方的引用,会造成严重的依赖,修改一个类可能会导致其他类的连锁修改,但有了Facade类,他们之间的关系被放在了Facade类里,起到了解耦的作用。

二、UML结构图:

Java设计模式之结构型:外观模式

  • Facade 门面角色:客户端可以调用这个角色的方法,该角色知晓相关子系统的功能。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。
  • SubSystem 子系统角色:可以同时有一个或者多个子系统。每个子系统都不是一个单独的类,而是一个类的集合(如上面的子系统就是由 SubSystemA、SubSystemB、SubSystemC、SubSystemD 几个类组合而成)。每个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面角色仅仅是另外一个客户端而已。

三、代码实现:

我们以一个计算机的启动过程为例:

Java设计模式之结构型:外观模式

我们先看下实现类:

public class CPU {
	
	public void startup(){
		System.out.println("cpu startup!");
	}
	
	public void shutdown(){
		System.out.println("cpu shutdown!");
	}
}
public class Memory {
	
	public void startup(){
		System.out.println("memory startup!");
	}
	
	public void shutdown(){
		System.out.println("memory shutdown!");
	}
}
public class Disk {
	
	public void startup(){
		System.out.println("disk startup!");
	}
	
	public void shutdown(){
		System.out.println("disk shutdown!");
	}
}
//Facade类
public class Computer {
	private CPU cpu;
	private Memory memory;
	private Disk disk;
	
	public Computer(){
		cpu = new CPU();
		memory = new Memory();
		disk = new Disk();
	}
	
	public void startup(){
		System.out.println("start the computer!");
		cpu.startup();
		memory.startup();
		disk.startup();
		System.out.println("start computer finished!");
	}
	
	public void shutdown(){
		System.out.println("begin to close the computer!");
		cpu.shutdown();
		memory.shutdown();
		disk.shutdown();
		System.out.println("computer closed!");
	}
}

 User类如下:

public class User {
 
	public static void main(String[] args) {
		Computer computer = new Computer();
		computer.startup();
		computer.shutdown();
	}
}

运行结果:

start the computer!
cpu startup!
memory startup!
disk startup!
start computer finished!
begin to close the computer!
cpu shutdown!
memory shutdown!
disk shutdown!
computer closed!

Facade类其实相当于CPU、Disk、Memory模块的外观界面,有了这个Facade类,那么客户端就不需要亲自调用子系统中的CPU、Disk、Memory模块了,也不需要知道系统内部的实现细节,甚至都不需要知道CPU、Disk、Memory模块的存在,客户端只需要跟Facade类交互就好了,从而更好地实现了客户端和子系统中CPU、Disk、Memory模块的解耦,让客户端更容易地使用系统。

四、其他问题:

1、一个系统可以有几个外观类?

        在外观模式中,通常只需要一个外观类,并且此外观类只有一个实例,也就是单例类。但这并不意味着在整个系统里只有一个外观类,而仅仅是说对每一个子系统只有一个外观类。或者说,如果一个系统有好几个子系统的话,每一个子系统都有一个外观类,整个系统可以有数个外观类。

2、能否为子系统增加新行为?

        外观模式的用意是为子系统提供一个集中化和简化的沟通管道,而不能向子系统加入新的行为。比如医院中的接待员并不是医护人员,接待员并不能为病人提供医疗服务。


设计模式系列文章:

Java设计模式之创建型:工厂模式详解(简单工厂+工厂方法+抽象工厂)

Java设计模式之创建型:建造者模式

Java设计模式之创建型:单例模式

Java设计模式之创建型:原型模式

Java设计模式之结构型:适配器模式

Java设计模式之结构型:装饰器模式

Java设计模式之结构型:代理模式

Java设计模式之结构型:桥接模式

Java设计模式之结构型:外观模式

Java设计模式之结构型:组合模式

Java设计模式之结构型:享元模式

Java设计模式之行为型:策略模式

Java设计模式之行为型:模板方法模式

Java设计模式之行为型:责任链模式

Java设计模式之行为型:观察者模式

Java设计模式之行为型:访问者模式

Java设计模式之行为型:中介者模式

Java设计模式之行为型:命令模式

Java设计模式之行为型:状态模式

Java设计模式之行为型:备忘录模式

Java设计模式之行为型:迭代器模式

Java设计模式之行为型:解释器模式


参考博客:

JAVA设计模式之门面模式(外观模式)_一个本科小生的奋斗史-CSDN博客

设计模式读书笔记—–外观模式_chenssy 的技术博客-CSDN博客

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114648.html原文链接:https://javaforall.net

(0)
上一篇 2021年10月4日 下午5:00
下一篇 2021年10月4日 下午6:00


相关推荐

  • 一篇文章搞懂Java设计模式之责任链模式

    一篇文章搞懂Java设计模式之责任链模式简述 前端时间再看一些类库的源码 发现责任链模式的强大之处 尤其是和建造者模式的结合后强大的动态可扩展性更是牛逼的一塌糊涂 接下来赶紧了解一下吧 我们先来了解一下什么是责任链模式 职责链模式 ChainofRespo 使多个对象都有机会处理同一个请求 从而避免请求的发送者和接收者之间的耦合关系 将这些对象连成一条链 并沿着这条链传递该

    2026年3月20日
    2
  • 设计模式之工厂模式_单例模式和工厂模式

    设计模式之工厂模式_单例模式和工厂模式概述工厂模式(FactoryPattern)属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象

    2022年8月16日
    9
  • Java中常用的设计模式

    Java中常用的设计模式文章转载借鉴:http://blog.csdn.net/zhangerqing一、什么是设计模式设计模式(Designpattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块…

    2022年7月8日
    20
  • MVC设计模式总结

    MVC设计模式总结一 概述 nbsp nbsp MVC Modle View Controller 最初应用于桌面程序设计中 是 XeroxPARc 在 20 世纪 80 年代为编程语言 Smalltalk 80 发明的一种软件设计模式 MVC 将系统分解为业务模型 Modle 用户界面即视图 View 控制器 Controller 三部分 每一部分相对独立 职责单一 MVC 的思想实质就是 关注点分离 即将 M 和 V 的实现代码分离 从而

    2026年3月17日
    2
  • PHP 常见设计模式——工厂模式

    PHP 常见设计模式——工厂模式今天这篇文章主要是描述一下PHP常见设计模式之工厂模式。工厂模式其实可以划分为:简单工厂模式、工厂方法模式、抽象工厂模式等。

    2022年7月25日
    11
  • 大话设计模式(五)观察者模式

    大话设计模式(五)观察者模式大话设计模式 五 观察者模式概念在阎宏博士的 JAVA 与模式 一书中开头是这样描述观察者 Observer 模式的 观察者模式是对象的行为模式 又叫发布 订阅 Publish Subscribe 模式 模型 视图 Model View 模式 源 监听器 Source Listener 模式或从属者 Dependents 模式 观察者模式定义了一种一对多的依赖关系 让多个观察者对象

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号