針對可複用性的設計模式:設計模式
結構函數
(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),並且還增長了新的特性。這樣調用的時候日誌
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(); } } }
針對可維護性的設計模式繼承
創造
public class Factory implements TraceFactory { public getTrace(String type) { if(type.equals("file" ) return new FileTrace(); else if (type.equals("system") return new SystemTrace(); } }
這樣就能夠根據傳入的參數選擇創造哪一種日誌了。
也能夠採用靜態工廠方法,直接建立工廠類,不須要建立接口,工廠類裏面有靜態工廠方法,無需實例化工廠類。