胖虎白话学习设计模式之适配器设计模式(Adapter)

胖虎白话学习设计模式之适配器设计模式(Adapter)
记录胖虎学习设计模式过程,不许勿喷,转载请注明出处!

http://blog.csdn.net/ljphhj


1.存在问题
开发中我们经常会遇到一种情况,客户需要实现的一些功能,我们之前编写的类中已经有实现了(不能修改原先设计好的类),
这样已有的类可以提供客户需要的这种功能,只是方法名不同而已.
那为了不重复造轮子,累死累活的,我们需要怎么解决呢?

那么引入解决方法:适配器设计模式


2.适配器设计模式(Adapter)

该设计模式主要用于:当客户需要我们提供接口实现某个功能时,保留现有类提供给我们的服务,向客户提供他所需要的接口,满足客户需求[Adapter模式允许我们使用现存的类来实现客户类的需求]

通俗地打个比方:就跟手机充电一样,无论你是拿到哪种电压环境下(中国(China) 220V 或者 台湾(Taiwan) 110V),只要通过电源适配器的转换就都可以完成对手机的充电,而不会有问题!(PS:充电适配器将电压转换为客户所需要的12V标准电压了)

在该模式中主要涉及到两种:


1.类适配器
当客户在接口中定义了它想要的行为时,我们提供一个新类来实现接口和扩展现有类,这种方法会创建一个类适配器,将客户的接口调用转变成现有类的方法调用.

2.对象适配器
如果客户没有指定所需要的接口,我们可以使用现有类的实例来创建一个新的子类,这个方法会创建一个对象适配器,将客户的调用转变成现有类的实例


UML图讲述该设计模式要点:
图1:类适配器的UML


图2:对象适配器的UML


3.适配器设计模式的例子代码


类适配器例子代码:

package cn.xym.test;


	/**
	 * 客户Client需要的接口方法为:RequiredMethod
	 * 指定在接口IRequired中
	 * 
	 * @author 胖虎
	 *
	 */
	public class Client {
		public void saySomeThing(IRequired it){
			
			it.RequiredMethod();
		}
	}
	
	package cn.xym.test;


	public interface IRequired {
		public void RequiredMethod();
	}


	package cn.xym.test;


	/**
	 * 该类已经存在,并且提供的函数itselfMethod()可以满足客户端的需求
	 * 
	 * @author 胖虎
	 *
	 */
	public class ExistClass {
		public void itselfMethod(){
			System.out.println("我能满足Client的需求");
		}
	}
	
	package cn.xym.test;


	public class Adapter extends ExistClass implements IRequired{


		@Override
		public void RequiredMethod() {
			/**
			 * 调用到的是ExistClass中的那个满足Client类的需求的方法
			 */
			this.itselfMethod();
		}
	}



对象适配器例子代码:

package cn.xym.test;


	/**
	 * 客户Client可能指定了某个类中的某个方法要实现一个功能
	 * 这时候不是指定接口,那么我们要实现这个类方法,重用原来的存在类的方法
	 * 
	 * @author 胖虎
	 *
	 */
	public class Client {
		
		public void saySomeThing(RequiredClass it){
			it.RequiredMethod();
		}
	}




	package cn.xym.test;


	/**
	 * 该类已经存在,并且提供的函数itselfMethod()可以满足客户端的需求
	 * 
	 * @author Administrator
	 *
	 */
	public class ExistClass {
		
		public void itselfMethod(){
			System.out.println("我能满足Client的需求");
		}
		
	}


	package cn.xym.test;


	/**
	 * 这个类可能是客户那边用了很多年的一个类
	 * 这个类里面可能有一个方法是满足客户需求的RequiredMethod()
	 * 但是由于我们现存类实现了这个方法,我们不想再去实现这个方法.
	 * 
	 * @author 胖虎
	 *
	 */
	public class RequiredClass {
		
		public void RequiredMethod(){
			//空方法
		}
		
	}


	package cn.xym.test;


	public class Adapter extends RequiredClass {
		private ExistClass existClass = null;
		
		public Adapter(ExistClass existClass) {
			this.existClass = existClass;
		}
		
		//覆盖掉父方法
		@Override
		public void RequiredMethod() {
			
			//super.RequiredMethod();
			this.existClass.itselfMethod();
		}
	}



已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页