二十三種設計模式分類
一、概述
外觀(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();
}
}