二十三種設(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();
}
}