Java實現23種設計模式(九):外觀模式

二十三種設計模式分類

設計模式三大分類.jpg


一、概述

外觀(Facade)模式的定義:是一種通過爲多個複雜的子系統提供一個一致的接口,而使這些子系統更加容易被訪問的模式。該模式對外有一個統一接口,外部應用程序不用關心內部子系統的具體的細節,這樣會大大降低應用程序的複雜度,提高了程序的可維護性。

優點

外觀(Facade)模式是“迪米特法則”的典型應用,它有以下主要優點。

  • 降低了子系統與客戶端之間的耦合度,使得子系統的變化不會影響調用它的客戶類。
  • 對客戶屏蔽了子系統組件,減少了客戶處理的對象數目,並使得子系統使用起來更加容易。
  • 降低了大型軟件系統中的編譯依賴性,簡化了系統在不同平臺之間的移植過程,因爲編譯一個子系統不會影響其他的子系統,也不會影響外觀對象。

缺點

  • 不能很好地限制客戶使用子系統類。
  • 增加新的子系統可能需要修改外觀類或客戶端的源代碼,違背了“開閉原則”。

場景

1、爲複雜的模塊或子系統提供外界訪問的模塊。
2、子系統相對獨立。
3、預防低水平人員帶來的風險。


二、實現

1. 結構圖

外觀(Facade)模式包含以下主要角色。

  • 外觀(Facade)角色:爲多個子系統對外提供一個共同的接口。
  • 子系統(Sub System)角色:實現系統的部分功能,客戶可以通過外觀角色訪問它。
  • 客戶(Client)角色:通過一個外觀角色訪問各個子系統的功能。

外觀模式

PS:UML結構圖可以參考,例子實現並不根據UML圖來完成,靈活實現即可;

2. 實現

  • 門面
package cn.missbe.model.facede;

/**
 * Copyright (c) 2020.
 * Email: [email protected]
 *
 * @author lyg  2020/4/30 上午11:31
 * description:
 * ShapeFacede當做Shape各個子系統(Circle/Rectangle/Square)的門面
 **/

public class ShapeFacede {
    /**
     * 畫圓子系統
     */
    private Shape circle;
    /**
     * 畫矩形子系統
     */
    private Shape rectangle;
    /**
     * 畫正方形子系統
     */
    private Shape square;

    public ShapeFacede() {
        circle = new Circle();
        rectangle = new Rectangle();
        square = new Square();
    }

    /**
     * 畫圓
     */
    public void drawCircle(){
        circle.drawShape();;
    }

    /**
     * 畫矩形
     */
    public void drawRectangle(){
        rectangle.drawShape();;
    }

    /**
     * 畫正方形
     */
    public void drawSquare(){
        square.drawShape();;
    }
}
  • 子系統
package cn.missbe.model.facede;

/**
 * Copyright (c) 2020.
 * Email: [email protected]
 *
 * @author lyg  2020/4/30 上午11:29
 * description:
 * Shape系統
 **/

public abstract class Shape {
    abstract void drawShape();
}

class Circle extends Shape {
    @Override
    void drawShape() {
        System.out.println("Circle:Shape");
    }
}

class Rectangle extends Shape {
    @Override
    void drawShape() {
        System.out.println("Rectangle:Shape");
    }
}

class Square extends Shape {
    @Override
    void drawShape() {
        System.out.println("Square:Shape");
    }
}
  • 主類,使用者
package cn.missbe.model.facede;

/**
 * Copyright (c) 2020.
 * Email: [email protected]
 *
 * @author lyg  2020/4/30 上午11:26
 * description:
 * 門面模式:
 * 客戶只和門面交互,而不用涉及子系統部分;
 * SpringMVC的DispatcherServlet就是門面,請求都由DispatcherServlet來處理;
 **/

public class Main {
    public static void main(String[] args) {
        /*使用門面和各個子系統交互*/
        ShapeFacede shapeFacede = new ShapeFacede();
        shapeFacede.drawCircle();
        shapeFacede.drawRectangle();
        shapeFacede.drawSquare();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章