zoukankan      html  css  js  c++  java
  • java设计模式-----12、外观模式

      Facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种。Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面。这个一致的简单的界面被称作facade。

      外观模式的角色和职责  

      1、Facade:为调用方定义简单的调用接口。  

      2、Clients:调用者。通过Facade接口调用提供某功能的内部类群。  

      3、Packages:功能提供者。指提供功能的类群(模块或子系统)。

      使用场景

      在以下情况下可以考虑使用外观模式:
      (1)设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。
      (2) 开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。
      (3) 维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。
     
      简单来说,使用了外观模式,用户就不必直接面对众多功能模块,降低了使用难度,简单举个例子
      电脑开机进入系统,我们把他分为4步,首先打开电源,bois自检,系统引导,进入系统,4个功能是四个功能模块
      打开电源
    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、更好的划分访问层次:有些方法是对系统外的,有些方法是系统内部相互交互的使用的。子系统把那些暴露给外部的功能集中到门面中,这样就可以实现客户端的使用,很好的隐藏了子系统内部的细节。

     
     
     
  • 相关阅读:
    getWritableDatabase()与getReadableDatabase()方法
    使用drawBitmapMesh扭曲图像
    移动游戏背景
    使用Matrix控制图片和组件的变化
    使用Matrix控制图像或组件变换的步骤
    1105: 零起点学算法12——求2个日期之间的天数
    1104: 零起点学算法11——求梯形面积
    1103: 零起点学算法10——求圆柱体的表面积
    1102: 零起点学算法09——继续练习简单的输入和计算(a-b)
    1101: 零起点学算法08——简单的输入和计算(a+b)
  • 原文地址:https://www.cnblogs.com/xiaobai1226/p/8566231.html
Copyright © 2011-2022 走看看