设计模式学习--------5.适配器模式学习
2014-05-18 17:19
211 查看
转载:/article/1602440.html
场景:
系统升级后,定义了一套新的接口逻辑,但是希望新的接口能兼容旧的功能,比如有些用户没有升级
新版本,还是使用旧的接口和功能.
类比原来的插头和插孔是两箱的,现在插孔换成或者叫定义成了三箱,这样三箱的插头才可以使用,
原来两箱的需要用一个转换器或者叫适配器将两箱转成三箱,这样就可以继续使用.
定义:
将一个类的接口转换成客户希望的另外一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可
以一起工作.
角色:
Target:新的业务接口
package com.kris.study;
public interface Target {
public void request();
}
Adaptee:已经存在的功能,通常能满足客户端要求,但是与新接口的方法定义不一致,需要被适配
package com.kris.study;
public class Adaptee {
public void oldRequest(String s){
System.out.println(s);
}
}
Adapter: 适配器,把Adaptee适配成为Client需要的Target.
package com.kris.study;
public class Adapter implements Target{
private Adaptee adaptee;
public Adapter(Adaptee adaptee){
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.oldRequest("old method invoke");
}
}
Client: 客户端,调用Target接口实现业务
package com.kris.study;
public class Client {
public static void main(String[] args) {
Adaptee adaptee = new Adaptee();
Adapter adapter = new Adapter(adaptee);
adapter.request();
}
}
原理分析:
适配器的本质是: 转换匹配,复用功能.
通过转换调用已有实现,从而能把已有的实现匹配成需要的接口,使之满足新的业务需要,所以转换匹配是手段,复用已有功能才是目的。
适配器实际上利用了对象组合的方式
一个适配器可以适配多个Adaptee,也就是实现新的Target接口时需要调用多个不同的模块,也可以缺省实现,简单
的转换接口的参数.复杂度取决于Target和Adaptee的相似程度.
一个适配器也可以进行双向适配,比如上面的例子同时让新的接口实现类TargetImpl去适配Adaptee接口.
优点:
更好的复用性,扩展性.
缺点:
当旧的功能与新的接口功能相似度很低时,使用适配还不如重写方便
当过多的使用适配器,会导致系统零乱,明明是调用A的接口,实际上却是通过B的接口来实现.这时应该选择重构.
场景:
系统升级后,定义了一套新的接口逻辑,但是希望新的接口能兼容旧的功能,比如有些用户没有升级
新版本,还是使用旧的接口和功能.
类比原来的插头和插孔是两箱的,现在插孔换成或者叫定义成了三箱,这样三箱的插头才可以使用,
原来两箱的需要用一个转换器或者叫适配器将两箱转成三箱,这样就可以继续使用.
定义:
将一个类的接口转换成客户希望的另外一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可
以一起工作.
角色:
Target:新的业务接口
package com.kris.study;
public interface Target {
public void request();
}
Adaptee:已经存在的功能,通常能满足客户端要求,但是与新接口的方法定义不一致,需要被适配
package com.kris.study;
public class Adaptee {
public void oldRequest(String s){
System.out.println(s);
}
}
Adapter: 适配器,把Adaptee适配成为Client需要的Target.
package com.kris.study;
public class Adapter implements Target{
private Adaptee adaptee;
public Adapter(Adaptee adaptee){
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.oldRequest("old method invoke");
}
}
Client: 客户端,调用Target接口实现业务
package com.kris.study;
public class Client {
public static void main(String[] args) {
Adaptee adaptee = new Adaptee();
Adapter adapter = new Adapter(adaptee);
adapter.request();
}
}
原理分析:
适配器的本质是: 转换匹配,复用功能.
通过转换调用已有实现,从而能把已有的实现匹配成需要的接口,使之满足新的业务需要,所以转换匹配是手段,复用已有功能才是目的。
适配器实际上利用了对象组合的方式
一个适配器可以适配多个Adaptee,也就是实现新的Target接口时需要调用多个不同的模块,也可以缺省实现,简单
的转换接口的参数.复杂度取决于Target和Adaptee的相似程度.
一个适配器也可以进行双向适配,比如上面的例子同时让新的接口实现类TargetImpl去适配Adaptee接口.
优点:
更好的复用性,扩展性.
缺点:
当旧的功能与新的接口功能相似度很低时,使用适配还不如重写方便
当过多的使用适配器,会导致系统零乱,明明是调用A的接口,实际上却是通过B的接口来实现.这时应该选择重构.
相关文章推荐
- 设计模式学习-提供者和适配器模式
- 设计模式学习(七)适配器模式
- HeadFirst 设计模式学习笔记7--适配器模式和外观模式
- 设计模式学习笔记-适配器模式
- 设计模式学习之适配器模式(Adapter)
- 步步为营 .NET 设计模式学习笔记 六、Adapter(适配器模式)
- HeadFirst 设计模式学习笔记6--适配器模式和外观模式
- 设计模式学习笔记-适配器模式
- 步步为营 .NET 设计模式学习笔记 六、Adapter(适配器模式)
- 步步为营 .NET 设计模式学习笔记 六、Adapter(适配器模式)
- PHP设计模式——适配器模式(研磨设计模式学习笔记)
- head first 设计模式学习随笔(7)----适配器模式和外观模式
- 设计模式学习----Adapter(适配器模式)
- 设计模式学习笔记十四:适配器模式、桥接模式与外观模式
- Head First 设计模式之适配器模式学习
- 设计模式学习:适配器模式
- 设计模式学习笔记(3)——适配器模式(Adapter Pattern)
- 设计模式学习5 -- 适配器模式(Adapter)
- 设计模式之适配器模式学习
- 设计模式学习笔记——适配器模式