不使用适配器模式

package com.zhss.designpattern.adapter;

/**
 * 不用设计模式的实现
 * @author zhonghuashishan
 *
 */
public class WithoutAdapterPatternDemo {
	
	public static void main(String[] args) {
		OldInterface oldObject = new OldInterfaceImpl();
		NewInterface newObject = new NewInterfaceImpl();
		oldObject.oldExecute();
		newObject.newExecute();
		
		// 如果不用任何设计模式,我们的问题在哪儿?
		// 问题其实很明显,就是说,我们的新的代码中,融合了新老两套接口,很麻烦的一个事情
		// 首先如果你这么干的话,就会导致代码很恶心,面向的是规范和风格完全不同的两套接口,你理解和维护的成本提高了
		// 其次,假如说,现在都不给你选择使用老版本接口的机会
		// 直接强制性公司规范要求按照新版本接口来走,你的老版本接口的实现类,就没法用了啊?
		// 难不成还要基于新版本的接口重新写一套?
	}
	
	/**
	 * 老版本接口
	 * @author zhonghuashishan
	 *
	 */
	public static interface OldInterface {
	
		void oldExecute();
		
	}
	
	/**
	 * 老版本接口的实现类
	 * @author zhonghuashishan
	 *
	 */
	public static class OldInterfaceImpl implements OldInterface {

		public void oldExecute() {
			System.out.println("老版本接口实现的功能逻辑");  
		}
		
	}
	
	/**
	 * 新版本接口
	 * @author zhonghuashishan
	 *
	 */
	public static interface NewInterface {
	
		void newExecute();
		
	}
	
	/**
	 * 新版本接口的实现类
	 * @author zhonghuashishan
	 *
	 */
	public static class NewInterfaceImpl implements NewInterface {

		public void newExecute() {
			System.out.println("新版本接口实现的功能逻辑");  
		}
		
	}
	
}

使用适配器模式

package com.zhss.designpattern.adapter;

public class AdapterPatterDemo {
	
	public static void main(String[] args) {
		NewInterface oldObject = new NewInterfaceAdapter(new OldInterfaceImpl());
		NewInterface newObject = new NewInterfaceImpl();
		oldObject.newExecute();
		newObject.newExecute();
		
		// 适配器模式
		// 就是你手上有新老俩接口和一个老接口的实现类
		// 但是现在系统中要面向新接口来开发,老接口的实现类就不能直接用了,不能直接面向老接口来开发
		// 开发一个老接口到新接口的一个适配器
		// 适配器是实现了新接口的,但是适配器中持有老接口实现类实例的引用
		// 适配器的新接口方法的实现,全部基于老接口实现类的老方法来实现即可
		// 对于调用方而言,只要使用适配器来开发即可,就可以通过面向新接口开发,底层使用老接口实现类
	}
	
	/**
	 * 定义一个适配器类
	 */
	public static class NewInterfaceAdapter implements NewInterface {
		
		private OldInterface oldObject;

		public NewInterfaceAdapter(OldInterface oldObject) {
			this.oldObject = oldObject;
		}
		
		public void newExecute() {
			oldObject.oldExecute();
		}
		
		
	}
	

	/**
	 * 老版本接口
	 */
	public static interface OldInterface {
	
		void oldExecute();
		
	}
	
	/**
	 * 老版本接口的实现类
	 */
	public static class OldInterfaceImpl implements OldInterface {

		public void oldExecute() {
			System.out.println("老版本接口实现的功能逻辑");  
		}
		
	}
	
	/**
	 * 新版本接口
	 */
	public static interface NewInterface {
	
		void newExecute();
		
	}
	
	/**
	 * 新版本接口的实现类
	 * @author zhonghuashishan
	 *
	 */
	public static class NewInterfaceImpl implements NewInterface {

		public void newExecute() {
			System.out.println("新版本接口实现的功能逻辑");  
		}
		
	}
	
}

使用场景

  1. 在系统不断升级到额过程中使用,对已经写好的老的类,写一套适配器来适配老类,但是提供新的接口
  2. 对于已经的第三方类库,比如redis的客户端或者elasticsearch的客户端,他们提供了一套api,但是我们这里要求是需要面向我们这里的DAO接口来编程,此时可以写一个适配器,将比如redis客户端的接口适配到我们的接口 比如说公司的DAO接口风格都是:save update remove list get, 但是redis的客户端提供的api是get set mset mget一套接口,此时就可以写一个适配器,这个适配器实现的是我们DAO接口,在我们的save update remove中区调用redis客户端的api。

总结

其实主要还是为了让调用方不去修改代码 实现适配器模式的操作步骤:

  1. 开发一个老接口到新接口的适配器,这个适配器中持有老接口实现类实例的应用
  2. 适配器的新接口方法的实现,全部基于老接口实现类的老方法来实现
  3. 调用方调用的时候,只需要关注适配器即可