23个java设计模式(五)-- 适配器模式

2016年03月10日 原创
关键词: java 设计模式
摘要 适配器模式将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式的关键是建立一个适配器,这个适配器实现了目标接口并包含有被适配者的引用。

一、概述。

适配器模式将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式的关键是建立一个适配器,这个适配器实现了目标接口并包含有被适配者的引用。

比如说有一个三项插头要插在双项插座上就需要一个适配器去适配双项插座,使其可以为三项插头服务。

二、适配器模式的结构。

Java适配器模式的结构中包括三种角色:

  • 目标(Target):目标是一个接口,该接口是客户想使用的接口。
  • 被适配者(Adaptee):被适配者是一个已经存在的接口或抽象类,这个接口或抽象类需要适配。
  • 适配器(Adapter):适配器是一个类,该类实现了目标接口并包含有被适配者的引用,即适配器的职责是对被适配者接口(抽象类)与目标接口进行适配。

三、示例程序。

目标

public interface ThreeHoleSocket {
	public abstract void connect();
}

被适配者

public interface TwoHoleSocket {
	public abstract void connect();
}

适配器

public class ThreeHoleSocketAdapter implements ThreeHoleSocket{
	TwoHoleSocket socket;
	
	public ThreeHoleSocketAdapter(TwoHoleSocket socket) {
		this.socket = socket;
	}

	@Override
	public void connect() {
		makeSomeChanges();
		socket.connect();
	}

	private void makeSomeChanges() {
		System.out.println("适配器让两个插孔的插头可以使用三相插座");
	}

}

测试类

public class TV implements TwoHoleSocket{
	private String name;
	
	public TV(String name) {
		this.name = name;
	}

	@Override
	public void connect() {
		System.out.println(name+"开始播放节目。");
	}

}


public class Wash implements ThreeHoleSocket{
	private String name;
	public Wash(String name) {
		this.name = name;
	}
	@Override
	public void connect() {
		System.out.println(name+"开始洗衣物。");
	}
}


public class Example1Test {
	@Test
	public void testMain() {
		Wash wash = new Wash("格力洗衣机");
		TV tv = new TV("乐视电视");
		ThreeHoleSocketAdapter adapter = new ThreeHoleSocketAdapter(tv);
		wash.connect();
		//插在适配器上的电视
		adapter.connect();
	}

 

更多的例子程序可以查看博主的github  https://github.com/cxylpy/design-patterns.git

四、适配器的适配程度。

 1、完全适配。

如果目标(Target)接口中的方法数目与被适配者(Adaptee)接口的方法数目相等,那么适配器(Adapter)可将被适配者接口(抽象类)与目标接口进行完全适配。

2、不完全适配。

如果目标(Target)接口中的方法数目少于被适配者(Adaptee)接口的方法数目,那么适配器(Adapter)只能将被适配者接口(抽象类)与目标接口进行部分适配。

3、剩余适配。

如果目标(Target)接口中的方法数目大于被适配者(Adaptee)接口的方法数目,那么适配器(Adapter)可将被适配者接口(抽象类)与目标接口进行完全适配,但必须将目标多余的方法给出用户允许的默认实现。

五、适配器模式的优点。

  1. 目标(Target)和被适配者(Adaptee)是完全解耦的关系。
  2. 适配器模式满足“开-闭原则”。当添加一个实现Adaptee接口的新类时,不必修改Adapter,Adapter就能对这个新类的实例进行适配。

六、使用适配器模式的场景。

一个程序想使用已经存在的类,但该类所实现的接口和当前程序所使用的接口不一致。