Java 实现适配器(Adapter)模式

平时我们会常常碰到这种情况,有了两个现成的类,它们之间没有什么联系。可是我们如今既想用当中一个类的方法。同一时候也想用另外一个类的方法。有一个解决方法是。改动它们各自的接口。可是这是我们最不愿意看到的。这个时候Adapter模式就会派上用场了

适配器 模式 有三种方式,一种是对象适配器,一种是类适配器, 一种是接口适配器

下面举例说明:

类适配器 类图


public class DrawRectangle {//画方
	public void drawRectangle(String msg) {
		System.out.println("draw Rectangle: " + msg);
	}
}

public interface IDrawCircle {//画圆的接口
	void drawCircle();
}

/**
 * 类适配器 使用对象继承的方式,是静态的定义方式
 * @author stone
 *
 */
public class DrawAdapter4Class extends DrawRectangle implements IDrawCircle {//既能画方又能画圆

	@Override
	public void drawCircle() {
		System.out.println("DrawAdapter4Class: drawCircle");
	}
	
}

对象适配器类图:


/**
 * 对象适配器: 使用对象组合的方式,是动态组合的方式。
 * 既能画方又能画圆
 * @author stone
 * DrawAdapter是适配器,DrawRectangle属于adapter,是被适配者,适配器将被适配者和适配目标(DrawCircle)进行适配
 *
 */
public class DrawAdapter4Object implements IDrawCircle {//既能画方又能画圆
	
	private DrawRectangle drawRectangle;
	public DrawAdapter4Object(DrawRectangle drawRectangle) {
		this.drawRectangle = drawRectangle;
	}
	
	@Override
	public void drawCircle() {
		System.out.println("DrawAdapter4Object: drawcircle");
	}
	
	public void drawRectangle(String msg) {
		drawRectangle.drawRectangle(msg);
	} 
	
}

接口适配器

类图


/*
 * 接口适配器:接口中有抽象方法,我们仅仅想实现当中的几个。不想所有实现,
 * 所以提供一个默认空实现,然后继承自它,重写实现我们想实现的方法
 */
public interface IDraw {
	void drawCircle();
	void drawRectangle();
}

/*
 * 接口适配器 的默认实现
 */
public class DefaultDrawAdapter implements IDraw {//画方 画圆 皆为空实现

	@Override
	public void drawCircle() {
		
	}

	@Override
	public void drawRectangle() {
		
	}
}

public class Test {
	public static void main(String[] args) {
		//对象适配器
		DrawAdapter4Object objAdapter = new DrawAdapter4Object(new DrawRectangle());
		objAdapter.drawCircle();
		objAdapter.drawRectangle(" in DrawAdapter4Object");
		
		System.out.println("--------------");
		
		//类适配器
		DrawAdapter4Class clzAdapter = new DrawAdapter4Class();
		clzAdapter.drawCircle();
		clzAdapter.drawRectangle("in DrawAdapter4Class");
		
		System.out.println("--------------");
		
		//接口适配器
		MyDrawAdapter myDrawAdapter = new MyDrawAdapter();
		myDrawAdapter.drawCircle();
		myDrawAdapter.drawRectangle();
	}
	
	static class MyDrawAdapter extends DefaultDrawAdapter {

		@Override
		public void drawCircle() {
			System.out.println("drawCircle in MyDrawAdapter");
		}
		
	}
}

打印

DrawAdapter4Object: drawcircle
draw Rectangle:  in DrawAdapter4Object
--------------
DrawAdapter4Class: drawCircle
draw Rectangle: in DrawAdapter4Class
--------------
drawCircle in MyDrawAdapter


原文地址:https://www.cnblogs.com/mthoutai/p/7071461.html