Java實(shí)現(xiàn)23種設(shè)計(jì)模式(九):外觀模式

二十三種設(shè)計(jì)模式分類

設(shè)計(jì)模式三大分類.jpg

一、概述

外觀(Facade)模式的定義:是一種通過(guò)為多個(gè)復(fù)雜的子系統(tǒng)提供一個(gè)一致的接口,而使這些子系統(tǒng)更加容易被訪問(wèn)的模式。該模式對(duì)外有一個(gè)統(tǒng)一接口,外部應(yīng)用程序不用關(guān)心內(nèi)部子系統(tǒng)的具體的細(xì)節(jié),這樣會(huì)大大降低應(yīng)用程序的復(fù)雜度,提高了程序的可維護(hù)性。

優(yōu)點(diǎn)

外觀(Facade)模式是“迪米特法則”的典型應(yīng)用,它有以下主要優(yōu)點(diǎn)。

  • 降低了子系統(tǒng)與客戶端之間的耦合度,使得子系統(tǒng)的變化不會(huì)影響調(diào)用它的客戶類。
  • 對(duì)客戶屏蔽了子系統(tǒng)組件,減少了客戶處理的對(duì)象數(shù)目,并使得子系統(tǒng)使用起來(lái)更加容易。
  • 降低了大型軟件系統(tǒng)中的編譯依賴性,簡(jiǎn)化了系統(tǒng)在不同平臺(tái)之間的移植過(guò)程,因?yàn)榫幾g一個(gè)子系統(tǒng)不會(huì)影響其他的子系統(tǒng),也不會(huì)影響外觀對(duì)象。

缺點(diǎn)

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

場(chǎng)景

1、為復(fù)雜的模塊或子系統(tǒng)提供外界訪問(wèn)的模塊。
2、子系統(tǒng)相對(duì)獨(dú)立。
3、預(yù)防低水平人員帶來(lái)的風(fēng)險(xiǎn)。


二、實(shí)現(xiàn)

1. 結(jié)構(gòu)圖

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

  • 外觀(Facade)角色:為多個(gè)子系統(tǒng)對(duì)外提供一個(gè)共同的接口。
  • 子系統(tǒng)(Sub System)角色:實(shí)現(xiàn)系統(tǒng)的部分功能,客戶可以通過(guò)外觀角色訪問(wèn)它。
  • 客戶(Client)角色:通過(guò)一個(gè)外觀角色訪問(wèn)各個(gè)子系統(tǒng)的功能。
外觀模式

PS:UML結(jié)構(gòu)圖可以參考,例子實(shí)現(xiàn)并不根據(jù)UML圖來(lái)完成,靈活實(shí)現(xiàn)即可;

2. 實(shí)現(xiàn)

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

/**
 * Copyright (c) 2020.
 * Email: love1208tt@foxmail.com
 *
 * @author lyg  2020/4/30 上午11:31
 * description:
 * ShapeFacede當(dāng)做Shape各個(gè)子系統(tǒng)(Circle/Rectangle/Square)的門面
 **/

public class ShapeFacede {
    /**
     * 畫圓子系統(tǒng)
     */
    private Shape circle;
    /**
     * 畫矩形子系統(tǒng)
     */
    private Shape rectangle;
    /**
     * 畫正方形子系統(tǒng)
     */
    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();;
    }
}
  • 子系統(tǒng)
package cn.missbe.model.facede;

/**
 * Copyright (c) 2020.
 * Email: love1208tt@foxmail.com
 *
 * @author lyg  2020/4/30 上午11:29
 * description:
 * Shape系統(tǒng)
 **/

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: love1208tt@foxmail.com
 *
 * @author lyg  2020/4/30 上午11:26
 * description:
 * 門面模式:
 * 客戶只和門面交互,而不用涉及子系統(tǒng)部分;
 * SpringMVC的DispatcherServlet就是門面,請(qǐng)求都由DispatcherServlet來(lái)處理;
 **/

public class Main {
    public static void main(String[] args) {
        /*使用門面和各個(gè)子系統(tǒng)交互*/
        ShapeFacede shapeFacede = new ShapeFacede();
        shapeFacede.drawCircle();
        shapeFacede.drawRectangle();
        shapeFacede.drawSquare();
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容