软构设计模式简单概括

针对可复用性的设计模式设计模式

结构函数

(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)访问者模式
  实现某些方法时委托给访问者,访问者能够有不一样的实现,从而能够切换访问方式。
相关文章
相关标签/搜索