java设计模式-----12、外观模式
Facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种。Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面。这个一致的简单的界面被称作facade。
外观模式的角色和职责
1、Facade:为调用方定义简单的调用接口。
2、Clients:调用者。通过Facade接口调用提供某功能的内部类群。
3、Packages:功能提供者。指提供功能的类群(模块或子系统)。
使用场景
1 public class StartPower { 2 /* 3 * 打开电源 4 */ 5 public void startPower(){ 6 System.out.println("电脑通电"); 7 } 8 }
bois自检
1 public class BoisSelfTest { 2 /* 3 * bios自检 4 */ 5 public void boisSelfTest(){ 6 System.out.println("bios自检"); 7 } 8 }
系统引导
1 public class SystemGuide { 2 /* 3 * 系统引导 4 */ 5 public void systemGuide(){ 6 System.out.println("系统引导"); 7 } 8 }
进入系统
1 public class EnterSystem { 2 /* 3 * 进入系统 4 */ 5 public void enterSystem(){ 6 System.out.println("进入系统"); 7 } 8 }
如果,我们没有使用外观模式,就需要用户自己挨个使用这些功能
1 public class MainClass { 2 public static void main(String[] args) { 3 StartPower startPower = new StartPower(); 4 startPower.startPower(); 5 6 BoisSelfTest boisSelfTest = new BoisSelfTest(); 7 boisSelfTest.boisSelfTest(); 8 9 SystemGuide systemGuide = new SystemGuide(); 10 systemGuide.systemGuide(); 11 12 EnterSystem enterSystem = new EnterSystem(); 13 enterSystem.enterSystem(); 14 } 15 }
运行结果为:
这样,电脑顺利启动,可是同样可以看出来,用户使用非常繁琐,不仅需要用户自己挨个使用所有用到的功能,同时还需要用户知道电脑启动的顺序,按顺序使用功能,不然就会导致问题,这样显然是不可取的
所以,用到外观模式,创建一个Facade,专门用于使用功能模块
1 public class Facade { 2 private StartPower startPower = null; 3 private BoisSelfTest boisSelfTest = null; 4 private SystemGuide systemGuide = null; 5 private EnterSystem enterSystem = null; 6 7 public void startComputer(){ 8 startPower = new StartPower(); 9 boisSelfTest = new BoisSelfTest(); 10 systemGuide = new SystemGuide(); 11 enterSystem = new EnterSystem(); 12 13 startPower.startPower(); 14 boisSelfTest.boisSelfTest(); 15 systemGuide.systemGuide(); 16 enterSystem.enterSystem(); 17 } 18 }
这时客户端就是这样
1 public class MainClass { 2 public static void main(String[] args) { 3 Facade computer = new Facade(); 4 computer.startComputer(); 5 } 6 }
可以看到,用户这时只需要调用Facade中的方法即可,无需知道电脑有什么具体的功能模块,无需知道功能模块执行的顺序是什么,只是调用一下就好了。
简化了使用,同时也增加了代码的复用与可维护性。
优点
1、松散耦合:使得客户端和子系统之间解耦,让子系统内部的模块功能更容易扩展和维护;
2、简单易用:客户端根本不需要知道子系统内部的实现,或者根本不需要知道子系统内部的构成,它只需要跟Facade类交互即可。
3、更好的划分访问层次:有些方法是对系统外的,有些方法是系统内部相互交互的使用的。子系统把那些暴露给外部的功能集中到门面中,这样就可以实现客户端的使用,很好的隐藏了子系统内部的细节。
下一篇: Spring Boot 入门