• 设计模式之外观模式


    设计模式之外观模式
    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. ‘不能过多非或者不合理的使用外观模式,使用外观模式好,还是直接调用模块好,要以让系统有层次,利于维护为目的

  • 相关阅读:
    第二阶段团队项目冲刺第三天
    第二阶段团队项目冲刺第二天
    第二阶段团队项目冲刺第一天
    第二次冲刺站立会议05
    第二次冲刺站立会议04
    第二次冲刺站立会议03
    第二次冲刺站立会议02
    第二次冲刺站立会议01
    第二次冲刺计划会议
    cnblogs.com的用户体验
  • 原文地址:https://www.cnblogs.com/juddy/p/15004406.html
Copyright © 2020-2023  润新知