1、定义spring
代理模式(Proxy):为其余对象提供一种代理以控制对这个对象的访问。代理类须要持有一个真实对象,用来对真实对象进行访问。mvc
适配器模式(Adapter):将一个类的接口转换成客户但愿的另一个接口,使得本来接口不兼容而不能一块儿工做的那些类能够一块儿工做。spa
适配器类提供新的接口给用户调用,同时须要持有一个被适配类的对象,在适配器类的接口方法中,通过本身的特定逻辑后,最终仍是会调用被适配的类对象的老接口。代理
即一个三孔的插头,进过适配器类的处理后,能插进原有的二孔插座里。对象
外观模式(Facade):咱们定义一个中间层(外观类),为客户端提供能够调用的接口。同时该接口可能调用子系统中的一组接口,从而隐藏系统的复杂性。blog
即在外观类的方法中,对原有系统的接口进行组合和封装,方便使用者使用。外观类须要持有各个子类的对象,经过这些对象调用子系统接口。继承
装饰器模式(Decorator):原有的类结构不变,可是功能不能知足现有的需求,对原有的功能进行加强。装饰器类须要持有一个被装饰类对象。接口
二类图ci
代理模式get
能够看到,真实对象和代理类,须要实现一个共同接口,因此他们具备共同的方法。
用户建立一个接口对象,其实是代理类的实现。就是说用户访问的是代理类对象,执行的是代理类重写的方法。
而一个代理类的构建,须要一个真实对象(能够在构建方法中new一个真实对象,还能够在构建方法中,传入一个真实对象)。代理类能够经过这个真实对象进行交互调用到真实对象的方法。在调用真实对象方法的先后,添加本身的特定逻辑。
Subject subject = new Proxy(new RealSubject());
subject.request();
适配器模式
能够看到,首先咱们要定义一个目标接口Target,该接口定义了给外部请求者使用的接口。
而后定义一个适配器类Adapter,它实现了目标接口,重写了接口中定义的方法。
而后在适配器类中,咱们须要引入一个须要适配的类对象。这里有分歧,能够经过
对象方式引入
就是适配器类Adapter能够定义一个成员属性为须要适配的类的对象Adaptee,在构造方法中new一个或者传入一个须要适配的类的对象。
而后在重写的Request()方法时,去执行本身的特殊逻辑,并经过Adaptee对象,去调用原有的接口方法。
类方式引入
就是适配器类Adapter即实现目标接口Target,又继承须要适配的类Adaptee,而后在用户执行Request()方法时,执行完适配器的逻辑后,
能够经过super.SpecificRequest()的方式,调用到原有的接口方法。
这里就会显出代理模式和适配器模式最大的区别,代理模式是与原对象实现同一个接口,而适配器类则是匹配新接口,说白了,实现一个新的接口。
外观模式
定义外观类,和暴露给用户使用的接口方法。
外观类等于新增长了一层,对已有系统接口的封装。
好比用户要实现某个功能,须要调用多个不一样类型的接口方法,才能完成用户但愿的操做。
这时外观类给用户提供一个接口,用户请求后就能够获得想要的结果,而不一样类型的调用,复杂的逻辑,交给外观类处理。
外观模式,说白了就是为系统和用户之间, 增长一层接口的封装,由外观类去处理复杂的接口调用和逻辑,最后返回用户想要的结果。就像spring mvc中的controller层同样。
装饰器模式
装饰器类须要和被装饰类,实现同一个接口,而且装饰器类,须要持有一个被装饰类对象。或者装饰器类直接继承被装饰类,
装饰器类是对被装饰类的功能的加强,因此装饰器类能够增长本身的属性和方法,用于功能的加强。
即装饰器类在重写了被装饰类的方法中,不但能够经过持有的被装饰类对象进行原有接口的调用,还能够调用本身的加强方法。
3、总结
代理模式:代理模式主要体现隔离。代理类和真实对象实现同一个接口,拥有共同的方法。代理类持有被代理类对象,访问者没法直接访问到真实对象,只能经过代理类访问真实对象。
适配器模式:用户访问新接口,适配器不但实现新接口的方法,还持有一个原有接口对象,在实现新接口的方法中,处理本身的特定逻辑,最后调用原有接口方法,达到适配的目的。
外观模式:增长一层接口的封装,简化使用者的操做。很像spring mvc中的controller
装饰器模式:装饰器类是对被装饰类的加强。实现方式有两种:装饰器类和被装饰类,能够实现同一个接口,同时装饰器类持有一个被装饰类对象。也可让装饰器类直接继承被装饰类。在装饰器类中,增长新的成员属性和方法。好比被装饰类是Circle,它只有一个方法draw(),那么装饰器类CircleDecorator,能够增长一个属性color,并增长setColor()方法,重写draw()方法时,里面添加一行setColor("red")。那么当用户调用修饰器类的draw()方法时,就能够画出一个红色的圆形。