首页 > 代码库 > 设计模式之适配器模式

设计模式之适配器模式


      适配器模式的概念是将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配就是从“源”到“目标”的适配,而中间链接“源”和“目标”的就是适配器。

       适配器一共涉及三种角色,分别是:1.目标接口(Target),即客户所期望的接口,目标可以是具体或者抽象的类,也可以是接口;2.需要适配的类(Adaptee);3.适配器(Adapter):通过包装一个需要适配的对象,将原接口转化成目标接口。

       举个简单例子来解释适配器模式:有一个"源"(Adaptee)是一个人,他会说日语和英语,但某个岗位(Target)需要的是既会日语,又要懂英语,还得懂法语,这时就需要我们添加一个说法语的方法,才能使该"源"(Adaptee)胜任这个岗位(Target)。那么具体该如何操作呢?一种方法是直接修改"源"(Adaptee),给他添加一个说法语的方法,但这样真的合适吗?适配是为了实现某种目的而暂时性的为"源"(Adaptee)添加上某种方法,所以不能修改"源"(Adaptee),而且一旦修改,就违背了java高内聚低耦合的特性。那么究竟怎样才能实现既添加方法,又不违背java高内聚低耦合的特性呢?

源代码如下:

public class Moluo {
	
	private String name;
	private String sex;
	private int age;
	
	public void speakJapanese(){
		System.out.println("I can speak Japanese!");
	}
	
	public void speakEnglish(){
		System.out.println("I can speak English!");
	}
	...//以下省略成员变量的get和set方法
}
目标接口代码如下:

public interface Job {
	
	public abstract void speakJapanese();
	public abstract void speakEnglish();
	public abstract void speakFrench();
	
}

适配器代码如下:

public class Adapter extends Moluo implements Job{

	public void speakFrench() {
		
	}
	
}

       噢啦,通过适配器模式,摩罗就成了精通三门外语的人才了,再也不用受六级的困扰了,想想都激动....

      其实,适配器模式有两种,一种是类适配器,另外一种是对象适配器。上述方法其实就是类适配器。由于java不支持多继承,只能单继承,所以一般类适配器用得就比较少,因为局限性比较明显,比如一个目标接口同时需要多个"源"(Adaptee),显然类适配器明显不能实现,所以就需要采用对象适配器来实现。

      源代码和目标接口代码同上,不再赘述,下面是适配器代码:

public class Adapter implements Job {

	Moluo moluo;

	public Adapter(Moluo moluo) {
		this.moluo = moluo;
	}

	public void speakEnglish() {
		moluo.speakEnglish();
	}

	public void speakJapanese() {
		moluo.speakJapanese();
	}

	//new add
	public void speakFrench() {
		
	}

}

        简要分析一下上述两种适配器模式,类的适配模式用于单一源的适配,由于它的源的单一话,代码实现不用写选择逻辑,很清晰;而对象的适配模式则可用于多源的适配,弥补了类适配模式的不足,使得原本用类适配模式需要写很多适配器的情况不复存在,弱点是,由于源的数目可以较多,所以具体的实现条件选择分支比较多,不太清晰。    

 最后总结一下适配器模式:

  优点:

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

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

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

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

  适用场景:

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

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

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

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

     5.使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。

尊重版权,转载请注明本文链接

                                      

                                           欢迎关注行者摩罗微信公众号(xingzhemoluo),共同交流编程经验,扫描下方二维码即可;    

                                                                  技术分享         

                                 


设计模式之适配器模式