您的位置:首页 > 编程语言 > Java开发

java设计模式之适配器模式

2016-01-01 18:16 489 查看

java适配器模式

1.定义

  适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

  

2.用途

使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。比如说你有一台笔记本电脑,它的插头是三相,但你家里电源只有两极,这时候你就可以用一个插座解决这个问题,这就是适配器模式所做的


3.实现方式

适配器模式的类图



组合方式实现(对象适配器)

/*
* 使用三相插座供电
*/
public interface ThreePlug {
public void poweredByThree();
}

/*
* 使用二相充电
*/
public class TwoPlug {
public void poweredByTwo(){
System.out.println("使用二相充电");
}
}

/*
* 二相转三相适配器
*/
public class Adapter implements ThreePlug {
private TwoPlug two;
public Adapter(TwoPlug two){
this.two=two;
}
@Override
public void poweredByThree() {
System.out.println("通过转换");
two.poweredByTwo();
}

}

/*
*笔记本
*/
public class NoteBook {
private ThreePlug three;
public NoteBook(ThreePlug three){
this.three=three;
}
public void charge(){
three.poweredByThree();
}
public static void main (String[] args){
TwoPlug two=new TwoPlug();
ThreePlug three=new Adapter(two);
NoteBook nb=new NoteBook(three);
nb.charge();
}
}


代码输出

通过转换
使用二相充电


特点:把被适配者作为一个对象组合到适配器类中,以修改目标接口包装被适配者

优点:被适配者的如何子类都可以搭配适配器使用,可以使得 Adapter 类(适配类)根据传入的 Adaptee 对象达到适配多个不同被适配类的功能,比较灵活

继承方式实现(类适配器)

/*
* 二相转三相适配器,通过继承被适配类和实现标准接口,直接在接口方法中调用父类方法
*/
public class Adapter extends TwoPlug implements ThreePlug {
@Override
public void poweredByThree() {
System.out.println("通过转换");
this.poweredByTwo();
}

}

/*
* 笔记本
*/
public class NoteBook {
private ThreePlug three;
public NoteBook(ThreePlug three){
this.three=three;
}
public void charge(){
three.poweredByThree();
}
public static void main (String[] args){

ThreePlug three=new Adapter();
NoteBook nb=new NoteBook(three);
nb.charge();
}
}


特点:多重继承不兼容接口,实现接口的匹配,因为java是单继承的,继承了这个类就不能继承该类其他子类 , 所以该方法适合单一地为某个类实现适配

4.模式总结

  4.1 优点

   通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。这样做更简单、更直接、更紧凑。

   复用了现存的类,解决了现存类和复用环境要求不一致的问题。

   将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码。

   一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。

  4.2 缺点

    对于对象适配器来说,更换适配器的实现过程比较复杂。

  4.3 适用场景

   系统需要使用现有的类,而这些类的接口不符合系统的接口。

   想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

   两个类所做的事情相同或相似,但是具有不同接口的时候。

   旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候。

   使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息