`
java苹果+番茄
  • 浏览: 65774 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

适配器模式【结构模式第六篇】

阅读更多
适配器模式(Adapter Pattern)(另称-变压器模式):
把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作

1、(类适配器)模式所涉及的角色有:
1/目标(Target)角色:这就是所期待得到的接口。由于是类适配器模式,因此目标不可以是类。
2/源(Adaptee)角色:现有需要适配的接口。
3/适配器(Adapter)角色:适配器类是本模式的核心。适配器把源接口转换成目标接口。显然,这一角色不可以是接口,
   而必须是具体类。
//目标角色类
		public interface Target{
			//源类有的方法
			void sampleOperation1();
			//源类没有的方法
			void sampleOperation2();
		}
		源类(具体类)
		public class Adaptee{
			//源类含有的方法sampleOperation1()
			public void sampleOperation1(){}
		}
		//适配器角色
		public class Adapter extends Adaptee implements Target{
			public void sampleOperation2(){}
		}

2、(对象适配器)
1):模式所涉及的角色有:
1/目标(Target)角色:这就是所期待的接口,目标可以是具体的或抽象的类
2/源(Adaptee)角色:现有需要适配的接口
3/适配器(Adapter)角色:适配器类是本模式的核心。适配器把源接口转换成目标接口,这一角色必须是具体类
//Target类
			public interface Target{
				//源类有的方法
				void sampleOperation1();
				//源来没有的方法
				void sampleOperation2();
			}
			源类(具体类)
			public class Adaptee{
				//源类含有的方法sampleOperation1()
				public void sampleOperation1(){}
			}
			//适配器类
			public class Adapter implements Target{
				private Adaptee adaptee;
				
				public Adapter(Adaptee adaptee){
					super();
					this.adaptee = adaptee;
				}
				//源类有的方法,适配器直接委派就可以了
				public void sampleOperation1(){
					adaptee.sampleOperation();
				}
				//源类没有,需要补充
				public void sampleOperation2(){
					//............
				}
			}

3、适配器模式的用意是将接口不同而功能相同或者相近的两个接口加以转换,这里面包括适配器角色补充了一个源角色没有的方法。

4、对象适配器模式的效果
1)一个适配器可以把多种不同的源适配到同一个目标,换言之,同一个适配器可以把源类和它的子类都适配到目标接口。
2)与类的适配器模式相比,要想置换源类的方法就不容易。如果一定要置换掉源类的一个或多个方法,就只好先做一个源
   类的子类,将源类的方法置换掉,然后再把原来的子类当做真正的源进行适配。
3)虽然要想置换源类的方法不容易,但是要想增加一些新的方法则方便的很,而且新增加的方法可同时适用于所有的源。

5、在什么情况下使用适配器模式
1)系统需要使用现有的类,而此类的接口不符合系统的需要。
2)想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
   这些源类不一定有很复杂的接口。
3)(对对象适配器模式而言)在设计里,需要改变多个已有的子类的接口,如果使用类的适配器模式,就要针对每一个子类做
   一个适配器,而这不太实际
//Itermeration类
		 import java.util.Iterator;
		 import java.util.*;
		 import java.util.Enumeration;
		 
		 public class Itermeration implements Enumeration{
		 	private Iterator it;
		 	
		 	public Itermeration(Iterator it){
		 		this.it = it;
		 		
		 		//是否存在下一个元素
		 		public boolean hasMoreElements(){
		 			return it.hasNext();
		 		}
		 		
		 		//返还下一个元素
		 		public Object nextElement() throws NoSuchElementException{
		 			return it.next();
		 		}
		 	}
		 }
		 
		 //Enuterator类
		 import java.util.Iterator;
		 import java.util.*;
		 import java.util.Enumeration;
		 
		 public class Enuterator implements Iterator{
		 	Enumeration enum;
		 	
		 	public Enuterator(Enumeration enum){
		 		this.enum = enum;
		 	}
		 	
		 	//是否存在下一个元素
		 	public boolean hasNext(){
		 		return enum.hasMoreElements();
		 	}
		 	
		 	//返还下一个元素
		 	public Object next() throws NoSuchElementsException{
		 		return enum.nextElement();
		 	}
		 	
		 	//删除当前的元素(不支持)
		 	public void remove(){
		 		throw new UnsupportedOperationException();
		 	}
		 }
		 --------------------------------------------------
		
		//立方体类
		public class Cube{
			private double width;
			
			public Cube(double width){
				this.width = width;
			}
			
			//计算体积
			public double calculateVolume(){
				return width*width*width;
			}
			
			//计算面积
			public double calculateFaceArea(){
				return width*width;
			}
			
			//长度的取值方法
			public double getWidth(){
				return this.width;
			}
			
			//长度的赋值方法
			public void setWidth(double width){
				this.width = width;
			}
		}
		
		//目标接口角色
		public interface BallIF{
			//计算面积
			double calculateVolume();
			//半径的取值方法
			double getRadius();
			//半径的赋值方法
			void setRadius(double radius);
		}
		
		//适配器类角色
		public class MagicFinger implements BallIF{
			private double redius = 0;
			private static final double PI = 3.14D;
			private Cube adaptee;
			
			public MagicFinger(Cube adaptee){
				super();
				this.adaptee = adaptee;
				radius = adpatee.getWidth();
			}
			
			//计算面积
			public double calculateArea(){
				return PI*4.0D*(radius);
			}
			
			public double calculateVolume(){
				return PI*(4.0D/3.0D)*(radius*radius*radius);
			}
			
			//半径取值方法
			public double getRadius(){
				return radius;
			}
			
			public void setRadius(double radius){
				this.radius = radius;
			}
		}
		


6、本模式在实现的时候有以下这些值得注意的地方;
1) 目标接口可以省略。此时,目标接口和源接口实际上是相同的。由于源是一个接口,而适配器类是一个类(或抽象类)
   因此这种做法看似平庸而并并平庸,它可以使客户端不必实现不需要的方法。
2)适配器类可以是抽象类,这可以在缺省适配情况下看到。
3)带参数的适配器模式。使用这种方法可以根据参数返还一个合适的实例给客户端

7、适配器模式与其他模式的关系
1)适配器模式与桥梁模式的关系
桥梁模式的用意是要把实现和它的接口分开,以便它们可以独立地变化。桥梁模式并不是用来把一个已有的对象接到不相
匹配的接口上的。当一个客户端只知道一个特定的接口,但是有必须与具有不同接口的类打交道时,就应当使用适配器模式。
2)适配器模式与装饰模式的关系
一个装饰类也是位于客户端和另外一个Compontent对象之间的,
在它接到客户端的调用后把调用传给一个或几个Component对象。
一个纯粹的装饰类必须与Compotent对象在接口上的完全相同,并增强后者的功能。
与适配器类不同的是,装饰类不能改变它所装饰的Compotent对象的接口。
3)适配器模式与缺省适配模式的关系
分享到:
评论

相关推荐

    Delphi模式编程第一分卷

    第6章 建造者模式(Builder) 6.1 模式解说 6.2 结构和用法 6.2.1 模式结构 6.2.2 代码模板 6.3 范例与实践 6.3.1 一个数据集对象产品的建造者模式 6.3.2 范例小结 第7章 单例模式(Singleton) 7.1 模式...

    Delphi模式编程第二分卷

    第6章 建造者模式(Builder) 6.1 模式解说 6.2 结构和用法 6.2.1 模式结构 6.2.2 代码模板 6.3 范例与实践 6.3.1 一个数据集对象产品的建造者模式 6.3.2 范例小结 第7章 单例模式(Singleton) ...

    java设计模式

    第6章 开闭原则 6.1 开闭原则的定义 6.2 开闭原则的庐山真面目 6.3 为什么要采用开闭原则 6.4 如何使用开闭原则 6.5 最佳实践 第二部分 我惹了谁——真刀实枪篇 第7章 单例模式 7.1 我是皇帝我独苗 7.2 单例模式的...

    《设计模式实训教程》【PPT+类图与代码+样章】

    4.2.1适配器模式实例之算法适配 4.2.2桥接模式实例之跨平台视频播放器 4.2.3组合模式实例之杀毒软件 4.2.4装饰模式实例之界面显示构件库 4.2.5外观模式实例之文件加密 4.2.6享元模式实例之围棋棋子 4.2.7代理...

    网络编程、常用设计模式

    详细的jsp网络编程、常用设计模式! 前言 3 第一部分:网络编程 4 一、了解URL 4 二、读取URL中的资源 4 1、URL构造方法: 5 2、读取资源 5 三、INETADDRESS类 5 ...四、在什么情况下使用适配器模式 26

    研磨设计模式(完整带书签).part2.pdf

    第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 ...

    C#设计模式 C# Design Patterns:A Tutorial

    第6章 UML图 第7章 C#中的数组、文件和异常 第二部分 创建型模式 第8章 简单工厂模式 第9章 工厂方法模式 第10章 抽象工厂模式 第11章 单件模式 第12章 生成器模式 第13章 原型模式 第三部分 结构型模式 第14章 ...

    ActionScript 3.0设计模式扫描版_方红琴译

    第6章 组合模式 什么是组合模式? 组合模式最小化示例 组合模式中关键的OOP概念 实例:歌曲播放列表 实例:利用反向运动学制作组合对象的动画效果 使用Flash内置的组合结构:显示列表 小结 第Ⅳ部分 行为...

    研磨设计模式(完整带书签).part1.pdf

    第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 ...

    Learning+PHP设计模式

    第6章 原型设计模式 第3部分 结构型设计模式 第7章 适配器模式 第8章 装饰器设计模式 第4部分 行为型设计模式 第9章 模板方法模式 第10章 状态设计模式 第5部分 MySQL和PHP设计模式 第11章 通用类负责连接,...

    研磨设计模式-part2

    第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章...

    设计模式精解及面试攻略

    第6章阐释行为模式(职责链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、策略、模板方法、访问者模式);第7章针对所有设计模式向初学者提供一些提示;第8章包括常见的面试问题及实际示例;第9章涵盖Java...

    研磨设计模式-part4

    第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章...

    研磨设计模式-part3

    第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章...

    设计模式可复用面向对象软件的基础.zip

    第6章 结论 232 6.1 设计模式将带来什么 232 6.2 一套通用的设计词汇 232 6.3 书写文档和学习的辅助手段 232 6.4 现有方法的一种补充 233 6.5 重构的目标 233 6.6 本书简史 234 6.7 模式界 235 6.8 Alexander 的模式...

    研磨设计模式.part3(共4个)

    第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) ...

    研磨设计模式.part2(共4个)

    第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) ...

    研磨设计模式.part4(共4个)

    第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) ...

    研磨设计模式.part1(共4个)

    第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) ...

Global site tag (gtag.js) - Google Analytics