同步操作将从 turnon/blog 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
title: 设计模式之外观模式
date: 2015-01-19 15:15:00
categories:
- 设计
- 设计模式
tags:
- 设计
- 设计模式
permalink: /pages/ea331b/
外观模式 (Facade) 是一种结构型设计模式, 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观 (Facade) 提供了一种访问特定子系统功能的便捷方式, 其了解如何重定向客户端请求, 知晓如何操作一切活动部件。
创建附加外观 (Additional Facade) 类可以避免多种不相关的功能污染单一外观, 使其变成又一个复杂结构。 客户端和其他外观都可使用附加外观。
复杂子系统 (Complex Subsystem) 由数十个不同对象构成。 如果要用这些对象完成有意义的工作, 你必须深入了解子系统的实现细节, 比如按照正确顺序初始化对象和为其提供正确格式的数据。
子系统类不会意识到外观的存在, 它们在系统内运作并且相互之间可直接进行交互。
客户端 (Client) 使用外观代替对子系统对象的直接调用。
Facade : 了解每个子系统类的功能,负责分发客户端的请求给各个子系统去处理。
class Class1 {
public void op1() {
System.out.println("方法1");
}
}
class Class2 {
public void op2() {
System.out.println("方法2");
}
}
class Class3 {
public void op3() {
System.out.println("方法3");
}
}
Subsystem Classes : 实现子系统功能。在不感知 Facade 的情况下,处理 Facade 对象分配的工作,
class Facade {
private Class1 one = new Class1();
private Class2 two = new Class2();
private Class3 three = new Class3();
public void op1() {
System.out.println("Facade op1()");
one.op1();
}
public void op2() {
System.out.println("Facade op2()");
two.op2();
}
public void op3() {
System.out.println("Facade op3()");
three.op3();
}
public void Method() {
System.out.println("Facade Method()");
three.op3();
two.op2();
one.op1();
}
}
【客户端】
public class FacadePattern {
public static void main(String[] args) {
Facade facade = new Facade();
facade.Method();
facade.op1();
}
}
【输出】
Facade Method()
方法3
方法2
方法1
Facade op1()
方法1
在本例中, 外观模式简化了客户端与复杂视频转换框架之间的交互。
你可以创建一个封装所需功能并隐藏其他代码的外观类, 从而无需使全部代码直接与数十个框架类进行交互。 该结构还能将未来框架升级或更换所造成的影响最小化, 因为你只需修改程序中外观方法的实现即可。
// 这里有复杂第三方视频转换框架中的一些类。我们不知晓其中的代码,因此无法
// 对其进行简化。
class VideoFile
// ...
class OggCompressionCodec
// ...
class MPEG4CompressionCodec
// ...
class CodecFactory
// ...
class BitrateReader
// ...
class AudioMixer
// ...
// 为了将框架的复杂性隐藏在一个简单接口背后,我们创建了一个外观类。它是在
// 功能性和简洁性之间做出的权衡。
class VideoConverter is
method convert(filename, format):File is
file = new VideoFile(filename)
sourceCodec = new CodecFactory.extract(file)
if (format == "mp4")
destinationCodec = new MPEG4CompressionCodec()
else
destinationCodec = new OggCompressionCodec()
buffer = BitrateReader.read(filename, sourceCodec)
result = BitrateReader.convert(buffer, destinationCodec)
result = (new AudioMixer()).fix(result)
return new File(result)
// 应用程序的类并不依赖于复杂框架中成千上万的类。同样,如果你决定更换框架,
// 那只需重写外观类即可。
class Application is
method main() is
convertor = new VideoConverter()
mp4 = convertor.convert("funny-cats-video.ogg", "mp4")
mp4.save()
使用示例: 使用 Java 开发的程序中经常会使用外观模式。 它在与复杂程序库和 API 协作时特别有用。
下面是一些核心 Java 程序库中的外观示例:
javax.faces.context.FacesContext
在底层使用了 LifeCycle
、 ViewHandler
和 NavigationHandler
这几个类, 但绝大多数客户端不知道。javax.faces.context.ExternalContext
在内部使用了 ServletContext
、 HttpSession
、 HttpServletRequest
、 HttpServletResponse
和其他一些类。识别方法: 外观可以通过使用简单接口, 但将绝大部分工作委派给其他类的类来识别。 通常情况下, 外观管理着其所使用的对象的完整生命周期。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。