设计模式-外观模式

一、外观模式的核心思想

在真实的应用系统中,一个子系统可能由很多类组成。子系统的客户为了满足它们的需要,黑要和子系统中的一些类进行交互。客户和子系统的类进行直接的交互会导致客户端对象和子系统之间高度耦合。如下图所示,X和Y对子系统内A、B和C都有调用,它们之间是高度耦合。

在这里插入图片描述
外观模式为子系统提供了一个更高层次、更简单的接口,从而降低了子系统的复杂度和依赖,这使得子系统更易于使用和管理。外观是一个能为子系统和客户提供简单接口的类。当正确地应用外观时,客户不再直接与子系统中的类交互,而是与外观交互。外观承担与子系统中类交互的责任。实际上,外观是子系统与客户的接口,这样外观模式降低了子系统和客户的耦合度。如下图所示,在 X、Y 与 A、B、C之间增加一个 Facade 外观类,它们之间的调用只需要通过 Facade 来进行。
在这里插入图片描述
外观对象隔离了客户和子系统对象,从而降低了耦合度。当子系统中的类进行改变时,客户端不会像以前一样受到影响。尽管客户使用由外观提供的简单接口,但是当需要的时候,客户端还是可以视外观不存在,直接访问子系统中的底层次的接口。在这种情况下,它们之间的依赖/耦合度和原来一样。

外观模式也是由代理模式发展而来的,与代理模式类似,代理式是一对一的代理,而外观模式是一对多的代理。与装饰模式不同的是,装饰模式为对象增加功能,而外观模式则是提供一个简化的调用方式。一个系统可以有多个外观类,每个门面类都只有一个实例,可以使用单例模式实现。

外观模式中包含3种角色:目标类、外观类、客户端类。以计算机的加载和关闭过程为例,这3 类角色如下。

  • 目标类:包括 CPU、内存和硬盘。
  • 外观类:即为计算机类。
  • 客户端类:即为用户。

它们之间的依赖关系如下图所示。

在这里插入图片描述
下面来看具体的实现。

(1) CPU类CPU.iava的源代码如下程序所示,其中定义了启动和关闭 CPU 的函数。

CPU类CPU.java

package structure.facade;

public class CPU {

	public void startup(){
		System.out.printin("启动CPU");
	}
	
	public void shutdown(){
		System.out.println("关闭CPU");
	}
}

(2) 内存类 Memory.java的源代码如下程序所示,其中定义了加载和清空内存的函数。

内存类Memory.java

package structure.facade;

public class Memory {

	public void startup(){
		System.out.printin("加载内存");
	}
	
	public void shutdown(){
		System.out.println("清空内存");
	}
}

(3) 硬盘类 Disk.java的源代码如下程序所示,其中定义了加载和卸载硬盘的函数。

硬盘类 Disk.java

package structure.facade;

public class Disk {

	public void startup(){
		System.out.printin("加载硬盘");
	}
	
	public void shutdown(){
		System.out.println("卸载便盘");
	}
}

(4) 外观模式类Computerjava的源代码如下程序所示,其中包含了CPU、内存和硬盘 3个类对象,并定义了启动和关闭计算机的函数,在启动和关闭时批量地启动和关闭CPU、内存和硬盘。

外观模式类 Computer.java

package structure.facade;



/**
* @author Minggg
* 外观模式
*/
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.printin("开始启动计算机");
		cpu.startup();
		memory.startup();
		disk.startup();
		Systemm.out.printin("启动计算机完成");
	}
	
	public void shutdown(){
		System.out.printn("开始关闭计算机");
		cpu.shutdown();
		memory.shutdown();
		disk.shutdown();
		System.out.println("关闭计算机完成");
	}
}

(5) 内存类 Memory.java的源代码如下程序所示,我们只需要调用 Computer.java 的函数来启动和关闭计算机,而不需要依次加载和关闭CPU、内存和硬盘。

用户类User.java

package structure.facade;

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

运行该程序的输出如下:

开始启动计算机
启动CPU
加载内存
加载硬盘
启动计算机完成

开始关闭计算机
关闭 CPU
清空内存
卸载硬盘
关闭计算机完成

从程序的输出可以看出,通过 Computer 一个外观类即可实现计算机所有部件的控制,而不需要单独去控制其所有的部件,这正是外观模式的作用。

二、何时使用外观模式

外观模式可以将一些列复杂的类包装成一个简单的封闭接口。外观模式对客户屏蔽了复杂的子系统组件,并为一般用户提供了一个比较简单的程序设计接口。但是,它并没有限制高级用户在需要时使用深层次的、较复杂的类。

三、Java中的应用

根据外观模式的应用场景可知,在Java中,凡是为一个子系统提供统一的外部接口,而不需要了解子系统内部的类都属于外观模式的应用。这种应用场景很多,比如JDBC,它则屏蔽了与数据库进行连接、查询、更新、删除等一系列操作,因此它就属于外观模式的应用。在现在比较普遍的开源框架中,如Hibermate 就可以算是一种外观模式。

  • 16
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java设计模式是一组经过实践验证的面向对象设计原则和模式,可以帮助开发人员解决常见的软件设计问题。下面是常见的23种设计模式: 1. 创建型模式(Creational Patterns): - 工厂方法模式(Factory Method Pattern) - 抽象工厂模式(Abstract Factory Pattern) - 单例模式(Singleton Pattern) - 原型模式(Prototype Pattern) - 建造者模式(Builder Pattern) 2. 结构型模式(Structural Patterns): - 适配器模式(Adapter Pattern) - 桥接模式(Bridge Pattern) - 组合模式(Composite Pattern) - 装饰器模式(Decorator Pattern) - 外观模式(Facade Pattern) - 享元模式(Flyweight Pattern) - 代理模式(Proxy Pattern) 3. 行为型模式(Behavioral Patterns): - 责任链模式(Chain of Responsibility Pattern) - 命令模式(Command Pattern) - 解释器模式(Interpreter Pattern) - 迭代器模式(Iterator Pattern) - 中介者模式(Mediator Pattern) - 备忘录模式(Memento Pattern) - 观察者模式(Observer Pattern) - 状态模式(State Pattern) - 策略模式(Strategy Pattern) - 模板方法模式(Template Method Pattern) - 访问者模式(Visitor Pattern) 4. 并发型模式(Concurrency Patterns): - 保护性暂停模式(Guarded Suspension Pattern) - 生产者-消费者模式(Producer-Consumer Pattern) - 读写锁模式(Read-Write Lock Pattern) - 信号量模式(Semaphore Pattern) - 线程池模式(Thread Pool Pattern) 这些设计模式可以根据问题的特点和需求来选择使用,它们提供了一些可复用的解决方案,有助于开发高质量、可维护且易于扩展的软件系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值