一.外观模式原理
1.一个家庭影院项目
DVD播放器、投影仪、自动屏幕、环绕立体声、爆米花机
2.传统的控制接口设计
直接用遥控器:统筹各设备开关(开爆米花机、放下屏幕、开投影仪、开音响、开DVD选DVD,去拿爆米花、调暗灯光、播放、观影结束后关闭各种设备)
3.外观模式的原理和设计
把所有的功能或类似功能放到一个按钮上,如一个Ready调用下面的所有开始方法。外观模式就是在所有这些接口的上层再绘制一个遥控器,把原来这个系统里面每个对象、类的接口调用统筹起来,分组打包。
外观模式:提供一个统一的接口,来访问子系统中一群功能相关接口。
外观模式定义了一个高层接口,让子系统更容易使用。
实例:
DVDPlayer.java
package com.bijian.study.facade.hometheater; /** * DVD播放器类 * @author bijian * */ public class DVDPlayer { private static DVDPlayer instance = null; private DVDPlayer() { } public static DVDPlayer getInstance() { if (instance == null) { instance = new DVDPlayer(); } return instance; } public void on() { System.out.println("DVDPlayer On"); } public void off() { System.out.println("DVDPlayer Off"); } public void play() { System.out.println("DVDPlayer is playing"); } public void pause() { System.out.println("DVDPlayer pause"); } public void setdvd() { System.out.println("DVDPlayer is setting dvd"); } }
Popcorn.java
package com.bijian.study.facade.hometheater; /** * 爆米花类 * @author bijian * */ public class Popcorn { private static Popcorn instance = null; private Popcorn() { } public static Popcorn getInstance() { if (instance == null) { instance = new Popcorn(); } return instance; } //打开 public void on() { System.out.println("Popcorn On"); } //关闭 public void off() { System.out.println("Popcorn Off"); } //爆米花 public void pop() { System.out.println("Popcorn is popping"); } }
Projector.java
package com.bijian.study.facade.hometheater; /** * 投影仪类 * @author bijian * */ public class Projector { private int size=5; private static Projector instance = null; private Projector() { } public static Projector getInstance() { if (instance == null) { instance = new Projector(); } return instance; } public void on() { System.out.println("Projector On"); } public void off() { System.out.println("Projector Off"); } public void focus() { System.out.println("Popcorn is focus"); } //放大 public void zoom(int size) { this.size=size; System.out.println("Popcorn zoom to"+size); } }
Screen.java
package com.bijian.study.facade.hometheater; /** * 屏幕类 * @author bijian * */ public class Screen { private static Screen instance = null; private Screen() { } public static Screen getInstance() { if (instance == null) { instance = new Screen(); } return instance; } //收起来 public void up() { System.out.println("Screen up"); } //放下来 public void down() { System.out.println("Screen down"); } }
Stereo.java
package com.bijian.study.facade.hometheater; /** * 音响类 * @author bijian * */ public class Stereo { private static Stereo instance = null; private int volume = 5; private Stereo() { } public static Stereo getInstance() { if (instance == null) { instance = new Stereo(); } return instance; } public void on() { System.out.println("Stereo On"); } public void off() { System.out.println("Stereo Off"); } //设置音量 public void setVolume(int vol) { volume = vol; System.out.println("the volume of Stereo is set to " + volume); } //加音量 public void addVolume() { if (volume < 11) { volume++; setVolume(volume); } } //减音量 public void subVolume() { if (volume > 0) { volume--; setVolume(volume); } } }
TheaterLights.java
package com.bijian.study.facade.hometheater; /** * 灯光类 * @author bijian */ public class TheaterLights { private static TheaterLights instance = null; private TheaterLights() { } public static TheaterLights getInstance() { if (instance == null) { instance = new TheaterLights(); } return instance; } public void on() { System.out.println("TheaterLights On"); } public void off() { System.out.println("TheaterLights Off"); } //调暗 public void dim(int d) { System.out.println("TheaterLights dim to " + d + "%"); } //调亮 public void bright() { dim(100); System.out.println("TheaterLights bright"); } }
HomeTheaterFacade.java
package com.bijian.study.facade.hometheater; /** * 家庭影院外观模式对象 * @author bijian * */ public class HomeTheaterFacade { private TheaterLights mTheaterLights; private Popcorn mPopcorn; private Stereo mStereo; private Projector mProjector; private Screen mScreen; private DVDPlayer mDVDPlayer; public HomeTheaterFacade() { mTheaterLights = TheaterLights.getInstance(); mPopcorn = Popcorn.getInstance(); mStereo = Stereo.getInstance(); mProjector = Projector.getInstance(); mScreen = Screen.getInstance(); mDVDPlayer = DVDPlayer.getInstance(); } public void ready() { mPopcorn.on(); mPopcorn.pop(); mScreen.down(); mProjector.on(); mStereo.on(); mDVDPlayer.on(); mDVDPlayer.setdvd(); mTheaterLights.dim(10); } public void end() { mPopcorn.off(); mTheaterLights.bright(); mScreen.up(); mProjector.off(); mStereo.off(); mDVDPlayer.setdvd(); mDVDPlayer.off(); } public void play() { mDVDPlayer.play(); } public void pause() { mDVDPlayer.pause(); } }
MainTest.java
package com.bijian.study.facade; import com.bijian.study.facade.hometheater.HomeTheaterFacade; public class MainTest { public static void main(String[] args) { HomeTheaterFacade mHomeTheaterFacade = new HomeTheaterFacade(); mHomeTheaterFacade.ready(); mHomeTheaterFacade.play(); //mHomeTheaterFacade.end(); } }
运行结果:
Popcorn On Popcorn is popping Screen down Projector On Stereo On DVDPlayer On DVDPlayer is setting dvd TheaterLights dim to 10% DVDPlayer is playing
4.外观模式与命令模式
a.命令模式如何设计这个项目
宏命令里面是一个命令的数组,我们可以通过加载命令数组的方式按命令执行。当然,把每个命令变成一个命令对象,再将其放到宏命令里面,然后把宏命令放到我们的外观模式类上,也可以实现这样的功能。
b.外观模式和命令模式各自侧重点
外观模式侧重点是针以系统建一个高层接口,对外暴露几个重要功能,对调用方来说不需要知道里面的细节,是系统对外接口的简化;是一个子系统里面对外暴露的接口进行简化。
命令模式侧重点是把命令包装成对象,本身系统的接口是不变的,至于向外面去暴露出来,它其实是另外一种组合,是组合去解决问题的。侧重点是封装,把命令封装成对象,以后实现解耦,控制器和下面设备的解耦。
外观模式和适配器模式有些类似的地方,适配器一般来说把一个对象或类的接口转化成另一种形式,就像电源插座的转换;而外观模式则是一个系统对外功能或者提供对外接口的简化。
二.最少知识原则
1.最少知识原则的意义
最少知识原则:尽量减少对象之间的交互,只留几个“密友”。
项目设计中就是不要让太多的类耦合在一起。
2.如何遵循最少知识原则
对象的方法调用范围:该对象本身、作为参数传进来的对象、此方法创建和实例化的对象、对象的组件。
一个方法的返回值也是一个对象,作为返回值的对象,在使用时不在这个范围内。所以返回值对象的使用就是违背这个最少知识原则的。
实例:Car这个类里面有一个Engine对象,组件对象实例化后可以直接调用;start方法传进来一个对象Key也可以使用调用;类里面实例化的对象door可以直接调用。当然,如果Key的一个方法返回的是另外一个对象,那就不能调返回的这个对象的方法。
3.外观模式和最少知识原则
外观模式的外观层对外暴露几个接口,把相互交互的对象集缩小了,这就是外观模式应用最少知识原则的实例。
相关推荐
在Java编程中,外观模式的应用十分广泛,它能有效地降低系统的耦合度,提高代码的可读性和可维护性。 外观模式的核心思想是“高内聚,低耦合”。它将多个复杂的子系统封装到一个单一的接口中,使得客户端只需要与这...
外观模式(Facade Pattern)是设计模式中的一种结构型模式,它的主要目的是提供一个统一的接口,以便客户端可以更简单地与复杂的子系统交互。在Java中,这种模式通过创建一个新接口来封装多个子系统的操作,减少...
### Java设计模式之外观模式详解 #### 模式概述与定义 外观模式(Facade Pattern),又称门面模式,属于对象结构型模式的一种。其主要作用是为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易被使用...
Java设计模式是面向对象编程领域中的重要概念,它是一套被广泛接受并实践的解决软件设计问题的经验总结。设计模式并非具体的代码或库,而是一种在特定情境下为了解决常见问题而制定的通用解决方案的描述。它们描述了...
### Java设计模式详解 #### 一、背景与概念 在软件工程领域,设计模式是一种用于解决常见问题的可重用解决方案。《Java设计模式PDF》是一本由James W. Cooper编写的经典书籍,该书详细介绍了Java编程语言中的设计...
《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...
《Java设计模式》是刘伟老师的一本经典教材,它深入浅出地讲解了软件设计中的重要概念——设计模式。设计模式是经验丰富的开发者在解决常见问题时总结出的通用解决方案,是软件开发中的智慧结晶。这本书的课后习题和...
章节介绍:1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立...10、设计模式之State 11、设计模式之Facade(外观) 12、设计模式之Interpreter(解释器) 13、设计模式之Visitor
### Java设计模式(刘伟) #### 一、引言 在《Java设计模式》这本书中,作者刘伟全面地介绍了24种经典的设计模式,并通过丰富的案例和代码示例进行了详细的解析。本书不仅适合初学者作为入门教材,也适合有一定...
Java设计模式是软件工程中的一种最佳实践,它总结了在特定场景下解决常见问题的经验,为程序员提供了可重用的解决方案。本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与...
设计模式之Facade(外观) 设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计模式之Decorator(油漆工) 设计模式之Bridge 设计模式之Flyweight(享元) 行为模式: 设计模式之Template ...
《Java设计模式》是刘伟教授的一本关于设计模式的教材,主要面向高等学校的学生和对Java编程有深入兴趣的开发者。设计模式是软件工程中的一种重要思想,它封装了在特定场景下的问题解决方案,可以提高代码的可读性、...
Java作为一门广泛应用的开发语言,其设计模式的应用对于提高代码质量、可维护性和可扩展性至关重要。本文将着重探讨创建型模式、结构型模式和行为模式这三大类设计模式,并结合六项设计原则进行深入解析。 首先,...
" JAVA 设计模式概述" JAVA 设计模式是指在软件设计过程中,为了提高代码的可维护性、灵活性和可扩展性所使用的一些惯用解决方案。JAVA 设计模式可以分为三种:创建模式、结构模式和行为模式。 1. 创建模式 创建...
适合Java设计模式期末考试选择题复习,形式如下: 10.(单选题)Facade(外观)模式的意图是 正确答案: A A.希望简化现有系统的使用方法,你需要定义自己的接口 B.将一个无法控制的现有对象与一个特定借口相匹配。 C....
Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决常见问题的经验总结和最佳实践。在这篇文章中,我们将深入探讨两种常见的设计模式:Facade(外观)模式和Simple Factory(简单工厂)模式。 首先,让...
### Java设计模式的应用 #### 一、引言 在当今快速发展的软件开发领域,Java作为一门功能强大且灵活的语言,不仅拥有丰富的API资源,还能与强大的数据库系统无缝对接。这使得许多开发人员能够以模块化的形式构建...
这是JAVA设计模式中属于结构模式的部分,包括Flyweight(共享模式)、Bridge(桥模式)、Decorator(装饰模式)、Composite(组合模式)、Adapter(适配器模式)、Proxy(代理模式)、Facade (外观模式)的源代码。其中有些模式中...
在《Java设计模式》这本书的模拟试题及其参考答案中,涉及了多条设计模式的知识点,以及它们的应用场景和实现方法。现在将这些知识点详细地解释如下: 1. 开闭原则(Open-Closed Principle, OCP): 开闭原则是面向...