大家好,欢迎来到IT知识分享网。
1. 理论
外观模式提供了一个统一的接口,用来访问子系统中的一组接口。它定义了一个高层接口,使得子系统更容易使用。换句话说,外观模式为复杂的子系统提供了一个简化的入口。
主要目的:
隐藏系统的复杂性,并提供一个简化的接口给客户端。
减少系统的依赖、松散耦合。
提高层次结构。
2. 实践
假设你有一个家庭影院系统,其中包括灯光、屏幕、音响等组件。每个组件都有自己的操作。为了观看电影,你需要执行一系列的操作:调暗灯光、放下屏幕、打开音响等。使用外观模式,我们可以为这些操作提供一个统一的接口。
代码示例:
定义子系统的组件:
class Lights { void dim() { System.out.println("Lights are dimming.."); } } class Screen { void down() { System.out.println("Screen is going down.."); } } class SoundSystem { void on() { System.out.println("Sound system is turned on.."); } }
定义外观类:
class HomeTheaterFacade { private Lights lights; private Screen screen; private SoundSystem soundSystem; public HomeTheaterFacade(Lights lights, Screen screen, SoundSystem soundSystem) { this.lights = lights; this.screen = screen; this.soundSystem = soundSystem; } public void watchMovie() { System.out.println("Get ready to watch a movie..."); lights.dim(); screen.down(); soundSystem.on(); } }
测试外观模式:
public class FacadePatternDemo { public static void main(String[] args) { Lights lights = new Lights(); Screen screen = new Screen(); SoundSystem soundSystem = new SoundSystem(); HomeTheaterFacade homeTheater = new HomeTheaterFacade(lights, screen, soundSystem); homeTheater.watchMovie(); } }
输出:
Get ready to watch a movie... Lights are dimming.. Screen is going down.. Sound system is turned on..
解释:
在此示例中,我们为家庭影院系统定义了三个子系统:灯光、屏幕和音响。每个子系统都有一些操作。
HomeTheaterFacade是我们的外观类,它提供了一个简化的接口watchMovie,该接口将子系统的操作组合在一起,以提供完整的功能。这样,客户端只需要与外观类交互,而不需要与每个子系统单独交互。
这就是外观模式的主要优点:它简化了客户端的接口,隐藏了子系统的复杂性,使得子系统更容易使用。
外观模式的核心概念:
外观模式的核心概念是为复杂的子系统提供一个统一的、简化的接口。当一个系统中的子系统与子系统之间存在大量的依赖关系时,外观模式可以帮助我们创建一个简化的接口,使得子系统更容易使用和理解。
优点:
简化了客户端的使用:客户端只需要与外观类交互,而不需要与子系统的各个组件单独交互。
提高了子系统的独立性:更改子系统的内部实现不会影响到使用外观的客户端。
提供了一个清晰的入口点:对于那些有多个复杂子系统的系统,外观模式提供了一个明确、易于理解的入口点。
使用场景:
当你想为一个复杂的子系统提供一个简单的接口时:例如,一个库有多个类,但大多数客户端只需要一个简化的API。
当客户端和抽象的实现类之间存在很多依赖关系时:引入外观可以帮助分离系统,提高其可维护性和灵活性。
当你需要定义系统的分层时:可以使用外观模式为每个子系统级别定义入口点。
我在描述中使用了“接口”这个词,可能引起了一些混淆。在这里,我所说的“接口”不特指Java中的interface关键字,而是指的是一个更广泛的概念,即提供给外部使用的一组方法或功能。
在上述的外观模式示例中,OrderFacade类提供了一个名为processOrder的方法,这个方法就是其对外部提供的“接口”。这意味着其他类或客户端代码可以调用这个方法来处理订单,而不必关心背后的细节。
所以,为了避免混淆,我们可以这样说:OrderFacade提供了一个公共的方法processOrder,允许外部调用,从而简化了与多个子系统的交互。这个方法就是我们所说的外观模式提供的“统一接口”。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/179009.html