设计模式之外观模式

设计模式之外观模式
  1. 外观模式基本介绍

    1. 外观模式也叫做过程模式:外观模式为子系统 的一组接口提供一个一致的界面 ,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用

    2. 外观模式通过定义一个一致的接口,用于屏蔽内部子系统的细节,使得调用端和这个接口发生调用,而无需关心这个子系统的内部细节

    3. 结构型模式

  2. 原外观模式原理类图

    1. 类图

    2. 分析

      1. 外观类(Facade):为调用端提供一个统一的调用接口, 外观类知道哪些子系统负责处理请求,从而将调用端的请求代理给与适当子系统对象

      2. 调用者(Client):外观接口的调用者

      3. 子系统的集合:指模块或者子系统,处理Facade对象指派的任务,是功能的实际提供者

  3. 通过外观模式解决影院管理

    1. 代码

      public class DVDPlayer{
         //使用单例模式中的饿汉式
         private static DVDPlayer instance= new DVDPlayer();
         private DVDPlayer(){}
         
         public static DVDPlayer getInstance(){
             return instance;
        }
         public void on(){
             System.out.println("DVD on");
        }
         
         public void off(){
             System.out.println("DVD off");
        }
         
         public void play(){
             System.out.println("DVD is playing");
        }
         public void stop(){
             System.out.println("DVD is stop");
        }
      }

      //爆米花机
      public clas Popcorn{
          //使用单例模式中的饿汉式
         private static Popcorn instance= new Popcorn();
         private Popcorn(){}
         
         public static Popcorn getInstance(){
             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 poping");
        }
      }
      //投影仪
      public class Projector{
           //使用单例模式中的饿汉式
         private static Projector instance= new Projector();
         private Projector(){}
         
         public static Projector getInstance(){
             return instance;
        }
         public void on(){
             System.out.println("Projector on");
        }
         
         public void off(){
             System.out.println("Projector off");
        }
         
         public void focus(){
             System.out.println("Projector is focus");
        }  
      }

      //屏幕
      public class Screen{
            //使用单例模式中的饿汉式
         private static Screen instance= new Screen();
         private Projector(){}
         
         public static Screen getInstance(){
             return instance;
        }
         public void up(){
             System.out.println("Screen up");
        }
         
         public void down(){
             System.out.println("Screen down");
        }
           
      }

      //立体声
      public class Stereo{
          //使用单例模式中的饿汉式
         private static Stereo instance= new Stereo();
         private Stereo(){}
         
         public static Stereo getInstance(){
             return instance;
        }
         public void on(){
             System.out.println("Stereo on");
        }
         
         public void off(){
             System.out.println("Stereo off");
        }    
         //声音调大
         public void up(){
             System.out.println("Stereo up");
        }
      }

      //影院的灯光
      public clas TheaterLight{
            //使用单例模式中的饿汉式
         private static TheaterLight instance= new TheaterLight();
         private Stereo(){}
         
         public static TheaterLight getInstance(){
             return instance;
        }
         public void on(){
             System.out.println("TheaterLight on");
        }
         
         public void off(){
             System.out.println("TheaterLight off");
        }    
         //灯光调暗
         public void dim(){
             System.out.println("TheaterLight dim");
        }
         piblic void bright(){
             System.out.println("TheaterLight bright");
        }
      }  
      //影院的外观
      public class HomeTheaterFacade{
         private DVDPlayer dvd = DVDPlayer.getInstance();
         private Popcorn popcorn = Popcorn.getInstance();
         private Projector projector = Projector.getInstance();
         private Screen screen = Screen.getInstance();
         private Stereo stereo = Stereo.getInstance();
         private TheaterLight theaterLight = TheaterLight.getInstance();
         
         //具体操作步骤
         
         //准备
         public void ready(){
             popcorn.on();
             popcorn.pop();
             screen.down();
             projector.on();
             Stereo.on();
             dvd.on();
             theaterLight.dim();
        }
         
         //播放
         public void play(){
             dvd.play();
        }
         
         //暂停
         public void pause(){
            dvd.stop();
        }
         
         //结束
         public void end(){
             popcorn.off();
             theaterLight.bright();
             screen.up();
             Stereo.off();
             dvd.off();
        }
      }

      //客户端
      public class Client{
         public static void main(String[] args){
             HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade();
             homeTheaterFacade.ready();
             homeTheaterFacade.play();
        }
      }

       

       

  4. 外观模式在Mybatis框架中个应用

    1. Mybatis中Configuration去创建MetaIObject对象使用到了外观模式

    2. 类图

  5. 外观模式的注意事项和细节

    1. 外观模式对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性

    2. 外观模式对客户端与子系统的耦合性降低了,让子系统内部地方模块更容易拓展和维护

    3. 通过合理使用外观模式,可以更好的划分访问的层次

    4. 当系统需要进行分层设计时,可以考虑使用

    5. 在维护一个遗留的大型系统时,可能这个系统已经变的非常难以扩展和维护,此时可以考虑为新系统开发一个facade类,来提供遗留系统的比较清晰简单的接口,让新系统与Facade类交互,提高复用性

    6. ‘不能过多非或者不合理的使用外观模式,使用外观模式好,还是直接调用模块好,要以让系统有层次,利于维护为目的

原文地址:https://www.cnblogs.com/juddy/p/15004406.html