軟構設計模式簡單概括

針對可複用性的設計模式設計模式

結構函數

(1)適配器模式:spa

  client想要調用LegacyRectangle,可是他們的傳入參數不一致,咱們須要增長一個適配器類Rectangle,這個適配器類實現了Shape接口,因此client直接委託給shape接口(其實是調用適配器類)Shape shape = new Rectangle(),Rectangle裏面進行了一些操做,使得傳入的參數能委託給LegacyRectangle()實現。設計

(2)裝飾器模式代理

  client想要在原有stack上增長一些功能,因而他首先實現了stack接口爲ArrayStack,而後爲了擴充stack的功能,又設置了一個抽象裝飾類,這個抽象裝飾類實現了stack而且有將其做爲了本身的成員變量,便可以將外部傳入的stack具體實現類傳進抽象裝飾類中,這樣就將基本的stack功能委託給了原來的ArrayStack類,而具體裝飾類繼承了抽象裝飾類,在進行push操做時不只採用super調用父類的push方法(其實是調用了被委託類arraystack),並且還增長了新的特性。這樣調用的時候日誌

  Stack s = new ArrayStack();
   Stack t = new UndoStack(new ArrayStack());
  實際上並無出現抽象裝飾類,只是建立了一個具體實現類,並把它傳給具體裝飾類。
  這裏還有一個問題,就是這裏的抽象裝飾類看似實現了全部父類的方法,實際上他重複調用了父類的方法,所以至關於沒有真正實現。固然,這裏也能夠不實現,所有由具體的裝飾器子類實現。
(3)外觀模式
  client調用一個封裝類,這個類裏面能夠設置一個靜態函數,根據傳入的參數調用不一樣其餘類的方法
行爲
(1)策略模式
  在商店付錢,能夠建立將付款委託給一個接口實現,接口有多種實現方式,具體client調用時,能夠在商店的構造函數裏面肯定傳入的是哪一個接口
ShoppingCart cart = new ShoppingCart();
Item item1 = new Item("1234",10);
Item item2 = new Item("5678",40);
cart.addItem(item1);
cart.addItem(item2);
//pay by paypal
cart.pay(new PaypalStrategy("myemail@exp.com", "mypwd"));

(2)模板模式code

  就是抽象類裏面一些未實現的方法讓子類(能夠是多個不一樣的)實現。注意抽象類裏面的模板方法要加final,防止子類重寫。對象

(3)迭代器模式blog

public class Pair<E> implements Iterable<E> {
private final E first, second;
public Pair(E f, E s) { first = f; second = s; }
public Iterator<E> iterator() {
return new PairIterator();
}
private class PairIterator implements Iterator<E> {
private boolean seenFirst = false, seenSecond = false;
public boolean hasNext() { return !seenSecond; }
public E next() {
if (!seenFirst) { seenFirst = true; return first; }
if (!seenSecond) { seenSecond = true; return second; }
throw new NoSuchElementException();
}
public void remove() {
throw new UnsupportedOperationException();
} } }

 

針對可維護性的設計模式繼承

創造

(1)工廠模式
  有一個日誌接口,有系統日誌和文件日誌兩種實現方式。咱們能夠建立一個工廠方法接口,這個接口TraceFactory也有兩種實現方式,每種對應返回一個日誌。
        client調用時只需:     Trace log1 = new SystemTraceFactory().getTrace();
  固然,也能夠對TraceFactory只有一種實現方式,即
public class Factory implements TraceFactory {
public getTrace(String type) {
if(type.equals("file" )
return new FileTrace();
else if (type.equals("system")
return new SystemTrace();
} }

  這樣就能夠根據傳入的參數選擇創造哪一種日誌了。

  也能夠採用靜態工廠方法,直接建立工廠類,不須要建立接口,工廠類裏面有靜態工廠方法,無需實例化工廠類。

(2)抽象工廠模式
  工廠的工廠
  針對兩種不一樣的部件窗戶和門板,每種分別有兩種規格:大、小。爲了創造一個產品族,咱們設置一個抽象工廠接口,該接口有兩個子類,每一個子類有兩個工廠方法,分別是create大窗戶大門板,create小窗戶小門板。此外咱們還有一個工廠生成器類,根據傳入的工廠參數(工廠1或工廠2)調用相應的生產方法。
  client只須要new一個具體的抽象工廠傳給工廠生成類便可。
結構
(1)代理模式
  原本client能夠直接調用真實對象,可是爲了某些緣由,咱們把真實對象的方法剝離出來設置爲一個接口,而後用真實和代理對象分別實現,其中代理對象實現的時候其實是將該對象委託給真實對象實現。
行爲
 (1)觀察者模式
  偶像接口的狀態改變委託給粉絲實現更新,粉絲接口的實現裏更新可改變狀態,粉絲建立以後委託偶像實現attach。
(2)訪問者模式
  實現某些方法時委託給訪問者,訪問者能夠有不一樣的實現,從而能夠切換訪問方式。
相關文章
相關標籤/搜索