1. 程式人生 > >二十三種設計模式(三)

二十三種設計模式(三)

12.外觀模式

外觀模式(Facade),隱藏了系統的複雜性,並向客戶端提供了一個可以訪問系統的介面。這種型別的設計模式屬於結構性模式。為子系統中的一組介面提供了一個統一的訪問介面,這個介面使得子系統更容易被訪問或者使用。

簡單來說,該模式就是把一些複雜的流程封裝成一個介面供給外部使用者更簡單的使用。這個模式中,設計到3個角色。

  1).門面角色:外觀模式的核心。它被客戶角色呼叫,它熟悉子系統的功能。內部根據客戶角色的需求預定了幾種功能的組合。

  2).子系統角色:實現了子系統的功能。它對客戶角色和Facade時未知的。它內部可以有系統內的相互互動,也可以由供外界呼叫的介面。

  3).客戶角色:通過呼叫Facede來完成要實現的功能。

13.享元模式

場景:記憶體屬於稀缺資源,不能隨便浪費。如果有多個相同或者類似的物件,我們可以通過享元模式來節省記憶體。

核心:享元模式以共享的方式高效的支援大量細粒度物件的重用。

關鍵:享元模式能做到共享的方式關鍵是能區分內部狀態與外部狀態:

  內部狀態:可以共享,不會隨環境的變化而改變。

  外部狀態:不可以共享,隨環境的變化而改變。

類圖:

//抽象享元類
public
interface ChessFlyWeight { void setColor(String Color); String getColor(); void display(Coordinate c); } //具體享元類
public class ConcreteChess implements ChessFlyWeight{ private String color; @Override public void setColor(String Color) { // TODO Auto-generated method stub this.color = color; } @Override public String getColor() { // TODO Auto-generated method stub return
this.color; } @Override public void display(Coordinate c) { // TODO Auto-generated method stub System.out.println("棋子顏色是"+color); System.out.println("位置是"+c.getX()+"______"+c.getY()); } public ConcreteChess(String color) { super(); this.color = color; } }
//非共享享元類
public class Coordinate{ private int x,y; public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public Coordinate(int x, int y) { super(); this.x = x; this.y = y; } }
//享元工廠類
public class ChessFlyWeightFactory { private static Map<String,ChessFlyWeight> map = new HashMap<String,ChessFlyWeight>(); public static ChessFlyWeight getChess(String color){ if(map.get(color)!=null){ return map.get(color); }else{ ChessFlyWeight chess = new ConcreteChess(color); map.put(color, chess); return chess; } } } public class Client { public static void main(String[] args) { ChessFlyWeight chessFlyWeight = ChessFlyWeightFactory.getChess("黑色"); ChessFlyWeight chessFlyWeight2 =ChessFlyWeightFactory.getChess("黑色"); System.out.println(chessFlyWeight); System.out.println(chessFlyWeight2); Coordinate c = new Coordinate(10, 20); chessFlyWeight.display(c); Coordinate c1 = new Coordinate(20, 30); chessFlyWeight2.display(c1); } }
執行結果:

[email protected]
[email protected]
棋子顏色是黑色
位置是10______20
棋子顏色是黑色
位置是20______30

 

享元模式應用場景:資料庫連線池、執行緒池、String類的設計。

優點:極大的減少記憶體中物件的數量、相似或相同的物件記憶體中只存一份,提高系統性能、外部狀態相對獨立,不影響內部狀態。

缺點:模式較複雜,使程式邏輯複雜化、以時間換空間,讀取外部狀態時間變長。