当前位置:首页 > 开发 > 编程语言 > 设计模式 > 正文

读《研磨设计模式》-代码笔记-适配器模式-Adapter

发表于: 2012-09-26   作者:bylijinnan   来源:转载   浏览:
摘要: 声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/ package design.pattern; /* * 适配器模式解决的主要问题是,现有的方法接口与客户要求的方法接口不一致 * 可以这样想,我们要写这样一个类(Adapter): * 1.这个类要符合客户的要求 ---> 那显然要
声明:
本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/


package design.pattern;

/*
 * 适配器模式解决的主要问题是,现有的方法接口与客户要求的方法接口不一致
 * 可以这样想,我们要写这样一个类(Adapter):
 * 1.这个类要符合客户的要求 ---> 那显然要implements客户要求的接口
 * 2.这些接口的实现是调用已有的类 ---> 有两种方法可获得已有的类的方法:
 * a.组合。对应“对象适配器”
 * b.继承。对应“类适配器”
 * 
 * 书上讲了一个新旧版日志操作的例子(旧版日志是存储在文件里,新版是存储在数据库里)
 * 书上说“新旧版日志共存”,但我觉得主要解决的问题不是共存(书上也不关注新版日志操作如何实现),
 * 而是应该强调如何“用新版日志的接口方法去调用旧版”
 * 书上新版日志操作的一个方法,正是调用了旧版的方法来实现,而新版的实现需自行处理,不在讨论范围内:
 public void updateLog(LoginModel lm){
       List<LogModel> list = adaptee.readLogFile();		//旧版的方法,文件操作
       for(int i=0;i<list.size();i++){
           if(list.get(i).getLogId().equals(lm.getLogId())){
              list.set(i, lm);
              break;
           }
       }
       adaptee.writeLogFile(list);
 }
 
 书上最后作了一个扩展:双向适配器,也是很有实际意义的。还是以日志操作为例,要求:
 1、主要使用旧版接口,但使用旧版接口时也希望能调用新版接口
 2、新版接口能兼容旧版接口——这是前面的例子
 我的理解其实就是说适配器为这两个需求提供两个“视图”或者说两套接口
 视图1:
 1.正常使用旧接口的方法(例如这个方法叫method())
 2.调用适配器的方法,从而实现“也能调用新接口”: new Adapter().method();
 视图2:
 1.正常使用新接口的方法(例如这个方法叫method2())
 2.调用适配器的方法,从而实现“也兼容旧接口”: new Adapter().method2();
 对于适配器来说,这其实有点分裂:旧版方法method()里面的实现代码其实是新版的实现代码,method2()里面的实现代码其实是旧版的实现代码
*/


//客户要求的接口
interface Target {
	void request();
}


//现有的接口或方法。与客户要求不一致。这个“不一致”可能是多样的,不局限于“方法名不一致”
//这个Adaptee也可以是实现现有的某个接口
class Adaptee {
	public void specificRequest() {
		System.out.println("specificRequest in adaptee.");
	}
}


//对象适配器
class ObjectAdapter implements Target {

	//如果Adaptee是implements某个接口,那应该写成:
	//private IAdaptee adaptee;
	private Adaptee adaptee;

	public ObjectAdapter(Adaptee adaptee) {
		this.adaptee = adaptee;
	}

	//调用旧的方法
	public void request() {
		adaptee.specificRequest();
	}

}


//类适配器
class ClassAdapter extends Adaptee implements Target {
	public void request() {
		super.specificRequest();
	}
}


//扩展:双向适配器

interface IOldAdaptee {
	public void method();
}


interface INewAdaptee {
	public void method2();
}


class TwoWayAdapter implements IOldAdaptee, INewAdaptee {

	private IOldAdaptee oldAdaptee;
	private INewAdaptee newAdaptee;

	public void method() {
		newAdaptee.method2();
	}

	public void method2() {
		oldAdaptee.method();
	}
}


class OldAdaptee implements IOldAdaptee {

	public void method() {}
	
}


class NewAdaptee implements INewAdaptee {
	
	public void method2() {}
	
}


class OldClient {
	
	public void test(){
		IOldAdaptee adaptee = new OldAdaptee();
		adaptee.method();
		//现在客户想通过旧接口调用新版的方法,那就要有一个适配器
		IOldAdaptee adapter = new TwoWayAdapter();		//注意这里adapter在类型是IOldAdaptee,也就是提供的是旧版的”视图“
		adapter.method();		//适配器里面调用的是新版的方法
	}
	
}


class NewClient {
	
	public void test(){
		INewAdaptee adaptee = new NewAdaptee();
		adaptee.method2();
		//现在客户想通过新接口调用旧版的方法,那就要有一个适配器
		//INewAdaptee adapter = new TwoWayAdapter();
		adaptee = new TwoWayAdapter();
		adaptee.method2();		//适配器里面调用的是旧版的方法
	}
	
}


public class AdapterPattern {

	public static void main(String[] args) {
		Adaptee adaptee = new Adaptee();
		Target adapter = new ObjectAdapter(adaptee);
		adapter.request();
		
		Target adapter2 = new ClassAdapter();
		adapter2.request();

	}

}

读《研磨设计模式》-代码笔记-适配器模式-Adapter

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
特性: 适配器通过转换调用已经有的实现,从而能把已有的实现匹配成需要的接口,使之能满足客户端的
写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案
1. 意图 将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起
定 义:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一
今天学习另一个设计模式,适配器(Adapter)模式,这是一个共同方向,但有特殊要求,就应用到此设计模
  前言:【模式总览】——————————by xingoo   模式意图   如果已经有了一种类,而需
  前言:【模式总览】——————————by xingoo   模式意图   如果已经有了一种类,而需
要想正确理解设计模式,首先必须明确它是为了解决什么问题而提出来的。 设计模式学习笔记 ——Shuli
设计模式-适配器模式(adapter) 适配器模式定义 将两个不兼容的类合在一起使用,属于结构型模式,需
例子 我们的网管告警亮灯:是否有告警需要从另一个公司的网管中获取,我们的接口是:bool IsAlarmin
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号