进阶之路:Java设计模式---外观模式

el/2024/4/19 23:41:57
外观模式定义:

外部与子系统间进行通信时,需要通过一个统一的外观进行,为子系统的一系列接口提供一个统一的界面。外观模式定义了一个高层接口,这个接口使子系统更易使用。外观模式又称为门面模式,它是一种对象型结构模式。

实现:

客户端发出一条指令:“将大象放进冰箱”;
服务端为了保证代码的单一职责原则,分别定义了三步操作:
1.打开冰箱门;
2.将大象勾引进冰箱;
3.关闭冰箱门;
在不使用外观模式的情况下,客户端需要知道每步操作是干什么的,又需要知道每步操作的调用顺序,这无疑增加了客户端的业务逻辑;通过外观模式,服务端只需给客户端暴露出一个“将大象放进冰箱”的函数,客户端不需要知道内部实现,只调用一次就可以

子系统的三步操作
public class OperationOne {public void openTheDoor(){System.out.print("\nopen the door\n");}}
public class OperationTwo {public void letIn(){System.out.print("\nlet ele in\n");}}
public class OperationThree {public void closeTheDoor(){System.out.print("\nclose the door\n");}}
外观类
/*** 外观角色* 客户端不需要亲自调用子系统中的A、B、C模块,也不需要知道内部的实现细节,甚至不需要知道* A、B、C模式是否存在,客户端只需要和Facade进行交互,从而实现了客户端和A、B、C模块的解耦* 让客户端更容易使用系统*/
public class Facade {public void test(){OperationOne one = new OperationOne();one.openTheDoor();OperationTwo two = new OperationTwo();two.letIn();OperationThree three = new OperationThree();three.closeTheDoor();}}
客户端调用
public class Client {public static void main(String [] args){Facade facade = new Facade();facade.test();}}
外观模式的扩展

能够有选择性的暴露函数。一个模块中定义的方法可以分为两类,供外部调用,供内部调用,使用外观
模式可以只将供外部调用的函数暴露出去,隐藏内部调用的函数。这样即避免了暴露内部细节,又避免
外部用户在调用时产生疑惑。

外观模式的优点

1.松散耦合:
外观模式松散了客户端与子系统之间的耦合度,让子系统内部的模块更容易维护和扩展

2.简单易用:
外观模式让子系统更加易用,客户端不需要知道子系统内部如何实现,也不需要和众多的子系统进行交互,只需要和外观类交互就行

3.更好的划分访问层次:
合理使用外观模式,能够帮我们更好的划分访问层次。有些方法时系统对外的,有些方法时系统对内的。把需要暴露的暴露出去,这样既方便外部调用,又能很好隐藏系统内部业务实现。


代码地址


http://www.ngui.cc/el/5181695.html

相关文章

Android崩溃日志收集---CrashHandler,给你自残的理由

使用CrashHandler的目的 测试人员过来告诉你,“你写的代码崩溃了!” “what ? ! 我写的代码怎么可能会崩溃?!你复现一下,污蔑我的话信不信自残给你看” “哎,这次怎么好了,什么情况?” 虽然说这种几率性bug可以晚点解决,但是终归是要解决的,但是复现又有点困难,那…

关于线程安全最通俗易懂的解释

下面的博客是在博客园上面看到的大佬写的,写的很好,通俗易懂,作为一个萌新看完以后促使我对线程安全有了新的理解。 博客未经博主的同意,所以未擅自转载,下面附快速通道 点次进入博客内容

Android 获取目录下所有文件信息(名字、大小)

private void getFiles(){File file = new File(GlobalConstant.POSLOGPATH);File[] files = file.listFiles();for (int i = 0; i < files.length; i++) {File childFile = files[i]

Java开发人员最常犯的9个错误

1.Array转ArrayList 当需要把Array转成ArrayList的时候&#xff0c;开发人员经常这样做&#xff1a; String [] strArray {"0" , "1" , "2"}; List<String> list Arrays.asList(intArray);Arrays.asList会返回一个ArrayList&#xff0…

Fragment的show()、hide()和attach()、detach()切换方式生命周期过程

1.使用show()、hide()方式进行fragment切换 @Overridepublic void onClick(View view) {switch (view.getId()){case R.id.main_home:switchFragmentWithShowHide(0);break;case R.id.main_shop:switchFragmentWithShowHide(1);break;case R.id.main_community:switchFragmentW…

aar包导入引起的Error:Failed to resolve: :xxxaar: 的问题

在Android Studio中 如果在module中依赖了aar库&#xff0c;当build工程的时候&#xff0c;会出现failed to resolve的错误 想要解决这个问题可以在app的build.gradle中加入下面代码&#xff1a; repositories {flatDir {dirs libs}}举个栗子&#xff1a;在app的build.gradle里…

Android Studio新建module,以及module引用aar等相关问题

一、新建module如果是作为lib被引用&#xff0c;需要选择Android Library。 二、作为lib的module如果引用了aar文件&#xff1a; 1、把aar文件放到module的libs目录下 2、作为lib的module的gradle文件&#xff1a; repositories {flatDir {dirs libs} }dependencies {.....…

Mysql在Spring中配置hibernate的字符编码格式

真正的配置非常简单&#xff0c;只需要在链接字符串加上对应的参数即可&#xff0c;如下示例&#xff1a;jdbc:mysql://localhost:3306/zbdx_jxdd?useUnicodetrue&characterEncodingUTF-8 useUnicodetrue &characterEncodingUTF-8是编码相关的配置&#xff0c;useUni…

windows操作系统下 ORACLE11g 重装系统后根据dbf恢复数据库

重点前提是&#xff1a;安装一个和原系统一致的oracle 环境&#xff0c;主要包括版本、数据名sid、实例名、路径和数据库编码一致 1. 进入cmd窗口&#xff0c;执行 sqlplus /nolog 命令&#xff1b; 2. 命令窗口输入 conn /as sysdba 登陆&#xff1b; 3. 命令窗口输入 …

VMware网络环境配置-桥接模式

近期在学习Hadoop相关知识&#xff0c;之前并未接触Linux系统&#xff0c;因此一并从头开始学习&#xff0c;在这个过程中&#xff0c;遇到不少问题&#xff0c;因此想要把学习过程整理一下&#xff0c;记录下来&#xff0c;以便以后回顾&#xff0c;也希望我的记录对其他人有帮…