1. 程式人生 > 其它 >Redisson 分散式鎖原始碼 07:公平鎖釋放

Redisson 分散式鎖原始碼 07:公平鎖釋放

設計模式之外觀模式
  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. ‘不能過多非或者不合理的使用外觀模式,使用外觀模式好,還是直接呼叫模組好,要以讓系統有層次,利於維護為目的