适配器模式

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

  适配器模式的用途:  

  用电器做例子,笔记本电脑的插头一般是三相的,即除了阳极,阴极外,还有一个地级,而有些地方的电源插座只有两级,没有地级,电源插座与笔记本的电脑插头不匹配使得笔记本电脑无法使用。这时候一个三相到两相的装换器(适配器)就能解决此问题,而这正是本模式所做的事情。简单地说,就是当你发现你的类实现接口的时候,只实现了一部分的方法,而没有另一部分的方法,这个类就相当于你的插头,而要实现的接口相当于是插座,你的插头只有两个头,而插座有三个头。这个时候,你就要有一个装换器了,也就是适配器,他能将两头的变成三头的,转换的方式就是你把二头的插到适配器上,然后适配器再用自己的三头插到插座上,也就是说,假如你的两个头就相当于两个方法,你把它插到装换器上,装换器自带一个头,也就是一个方法,这样就行了。

  适配器模式的结构:

  适配器模式有类的适配器模式和对象的适配器模式两种不同的形式;
        其中,类适配器模式是通过继承的方式来实现的,而对象的适配器模式是通过构造器对象注入的方式来实现的。
  先说一下,该模式设计到的角色有:
  目标角色:这就是所期待得到的接口,注意:这里讨论的是类适配器模式,因此目标不可以是类;
  源角色:现在需要适配的接口;
  适配器角色:适配器类是本模式的核心,适配器把源接口转换成目标接口,显然,这一角色不可以是接口,而必须是具体类;

         类的适配器模式;

  目标角色:

public interface Target {
/**
* 这是源类Adaptee也有的方法
*/
public void sampleOperation1();
/**
* 这是源类Adapteee没有的方法
*/
public void sampleOperation2();
}

  源角色:

public class Adaptee {

public void sampleOperation1(){}

}

  适配器角色:

public class Adapter extends Adaptee implements Target {
/**
* 由于源类Adaptee没有方法sampleOperation2()
* 因此适配器补充上这个方法
*/
@Override
public void sampleOperation2() {
//写相关的代码 }

}
下面是对象的适配器模式:
public interface Target {
/**
* 这是源类Adaptee也有的方法
*/
public void sampleOperation1();
/**
* 这是源类Adapteee没有的方法
*/
public void sampleOperation2();
}

  

public class Adaptee {

public void sampleOperation1(){}

}

  

public class Adapter {
private Adaptee adaptee;

public Adapter(Adaptee adaptee){
this.adaptee = adaptee;
}
/**
* 源类Adaptee有方法sampleOperation1
* 因此适配器类直接委派即可
*/
public void sampleOperation1(){
this.adaptee.sampleOperation1();
}
/**
* 源类Adaptee没有方法sampleOperation2
* 因此由适配器类需要补充此方法
*/
public void sampleOperation2(){
//写相关的代码 }
}

  类适配器和对象适配器的权衡:

类适配器用的是继承,是静态的定义方式,而对象适配器使用对象组合的方式,是动态组合的方式;
适配器的模式的优点:
    更好的复用性:
系统需要使用现有的类,而此类的接口不符合系统的需要,那么通过适配器模式就可以让这些功能得到更好的复用;
    更好的扩展性:
在实现适配器功能的时候,可以调用自己的开发的功能,从而自然地扩展系统的功能;
适配器的缺点:
    过多的使用适配器,会让系统非常凌乱,不易整体进行把握,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

posted on 2018-03-26 18:59  楚大校  阅读(329)  评论(0编辑  收藏  举报

导航