针对可复用性的设计模式:设计模式
结构函数
(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(); } }
这样就能够根据传入的参数选择创造哪一种日志了。
也能够采用静态工厂方法,直接建立工厂类,不须要建立接口,工厂类里面有静态工厂方法,无需实例化工厂类。