(参考:http://www.cnblogs.com/java-my-life/archive/2012/04/13/2442795.html)
一、类适配器
/DesignPatterns/src/com/louis/Adapter/Target.java
/** * Project Name:DesignPatterns * File Name:Target.java * Package Name:com.louis.Adapter * Date:2017年11月1日下午7:43:10 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved. * */ package com.louis.Adapter; /** * ClassName:Target * Function: TODO ADD FUNCTION. * Reason: TODO ADD REASON. * Date: 2017年11月1日 下午7:43:10 * @author michael * @version * @since JDK 1.7 * @see */ public interface Target { //源类也有的方法 public void sampleOperation1(); //源类没有地方法 public void sampleOperation2(); }
/DesignPatterns/src/com/louis/Adapter/Adaptee.java
/** * Project Name:DesignPatterns * File Name:Adaptee.java * Package Name:com.louis.Adapter * Date:2017年11月1日下午7:46:30 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved. * */ package com.louis.Adapter; /** * ClassName:Adaptee * Function: TODO ADD FUNCTION. * Reason: TODO ADD REASON. * Date: 2017年11月1日 下午7:46:30 * @author michael * @version * @since JDK 1.7 * @see */ public class Adaptee { public void sampleOperation1(){} }
/DesignPatterns/src/com/louis/Adapter/Adapter.java
/** * Project Name:DesignPatterns * File Name:Adapter.java * Package Name:com.louis.Adapter * Date:2017年11月1日下午7:47:57 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved. * */ package com.louis.Adapter; /** * ClassName:Adapter * Function: TODO ADD FUNCTION. * Reason: TODO ADD REASON. * Date: 2017年11月1日 下午7:47:57 * @author michael * @version * @since JDK 1.7 * @see */ public class Adapter extends Adaptee implements Target { /** * TODO 由于源类没有sampleOperation2()因此适配器补充上这个方法 * @see com.louis.Adapter.Target#sampleOperation2() */ public void sampleOperation2() { // TODO Auto-generated method stub } }
对象适配器模式
与类的适配器模式一样,对象的适配器模式把被适配的类的API转换成为目标类的API,与类的适配器模式不同的是,对象的适配器模式不是使用继承关系连接到Adaptee类,而是使用委派关系连接到Adaptee类。
/DesignPatterns/src/com/louis/Adapter/AdapterObject.java
/** * Project Name:DesignPatterns * File Name:AdapterObject.java * Package Name:com.louis.Adapter * Date:2017年11月1日下午7:53:38 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved. * */ package com.louis.Adapter; /** * ClassName:AdapterObject * Function: TODO ADD FUNCTION. * Reason: TODO ADD REASON. * Date: 2017年11月1日 下午7:53:38 * @author michael * @version * @since JDK 1.7 * @see */ public class AdapterObject implements Target{ private Adaptee adaptee; public AdapterObject(Adaptee adaptee){ this.adaptee = adaptee; } //源类Adaptee有方法sampleOperation1,因此适配器直接委派即可 public void sampleOperation1(){ this.adaptee.sampleOperation1(); } /** * TODO 源Adaptee没有方法sampleoperation2,因此由适配器需要补充此方法. * @see com.louis.Adapter.Target#sampleOperation2() */ public void sampleOperation2() { // TODO Auto-generated method stub //写相关的代码 } }
缺省适配模式的结构
/DesignPatterns/src/com/louis/Adapter/AbstractService.java
/** * Project Name:DesignPatterns * File Name:AbstractService.java * Package Name:com.louis.Adapter * Date:2017年11月1日下午8:09:10 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved. * */ package com.louis.Adapter; /** * ClassName:AbstractService * Function: TODO ADD FUNCTION. * Reason: TODO ADD REASON. * Date: 2017年11月1日 下午8:09:10 * @author michael * @version * @since JDK 1.7 * @see */ public interface AbstractService { public void serviceOperation1(); public int serviceOperation2(); public String serviceOperation3(); }
/DesignPatterns/src/com/louis/Adapter/ServiceAdapter.java
/** * Project Name:DesignPatterns * File Name:ServiceAdapter.java * Package Name:com.louis.Adapter * Date:2017年11月1日下午8:10:35 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved. * */ package com.louis.Adapter; /** * ClassName:ServiceAdapter * Function: TODO ADD FUNCTION. * Reason: TODO ADD REASON. * Date: 2017年11月1日 下午8:10:35 * @author michael * @version * @since JDK 1.7 * @see */ public class ServiceAdapter implements AbstractService { /** * TODO 简单描述该方法的实现功能(可选). * @see com.louis.Adapter.AbstractService#serviceOperation1() */ @Override public void serviceOperation1() { // TODO Auto-generated method stub } /** * TODO 简单描述该方法的实现功能(可选). * @see com.louis.Adapter.AbstractService#serviceOperation2() */ @Override public int serviceOperation2() { // TODO Auto-generated method stub return 0; } /** * TODO 简单描述该方法的实现功能(可选). * @see com.louis.Adapter.AbstractService#serviceOperation3() */ @Override public String serviceOperation3() { // TODO Auto-generated method stub return null; } }
可以看到,接口AbstractService要求定义三个方法,分别是serviceOperation1()、serviceOperation2()、serviceOperation3();而抽象适配器类ServiceAdapter则为这三种方法都提供了平庸的实现。因此,任何继承自抽象类ServiceAdapter的具体类都可以选择它所需要的方法实现,而不必理会其他的不需要的方法。