`

《Head.First设计模式》的学习笔记(9)--适配器模式

 
阅读更多

软件开发中经常遇到的问题:
假设已有一个软件系统,你希望它能和一个新的厂商类库搭配使用,但是这个新厂商所设计出来的接口,不同于旧厂商的接口。如果你不想改变现有的代码,也不能改变厂商的代码,那么你该如何解决这个问题。方法其实很简单,就是写一个类,将新厂商的的接口转成你所期望的接口。如图

这就是适配器模式。

意图:将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

结构:对象适配器
 
类适配器
 

下面我们来看一个具体的例子来阐释对象适配器:

先准备一只鸭子接口

public interface Duck {
	public void quack();
	public void fly();
}

 

再准备一只绿头鸭

public class MallardDuck implements Duck {
	public void quack() {
		System.out.println("Quack");
	}
 
	public void fly() {
		System.out.println("I'm flying");
	}
}

 

准备一只火鸡接口

public interface Turkey {
	public void gobble();
	public void fly();
}

 

在准备一只火鸡
package headfirst.adapter.ducks;

public class WildTurkey implements Turkey {
	public void gobble() {
		System.out.println("Gobble gobble");
	}
 
	public void fly() {
		System.out.println("I'm flying a short distance");
	}
}
 

 

现在,假设你缺鸭子对象,想用一些火鸡对象冒充鸭子,那么你该如何做呢?显然我们的问题是火鸡的接口和鸭子的接口不一样,那么我们可以通过写一个适配器的方法来解决。具体代码如下:

public class TurkeyAdapter implements Duck {
	Turkey turkey;
 
	public TurkeyAdapter(Turkey turkey) {
		this.turkey = turkey;
	}
    
	public void quack() {
		turkey.gobble();
	}
  
	public void fly() {
		for(int i=0; i < 5; i++) {
			turkey.fly();
		}
	}
}

 

现在我们来写一段测试程序:

public class DuckTestDrive {
	public static void main(String[] args) {
		MallardDuck duck = new MallardDuck();
 
		WildTurkey turkey = new WildTurkey();
		Duck turkeyAdapter = new TurkeyAdapter(turkey);
   
		System.out.println("The Turkey says...");
		turkey.gobble();
		turkey.fly();
 
		System.out.println("\nThe Duck says...");
		testDuck(duck);
  
		System.out.println("\nThe TurkeyAdapter says...");
		testDuck(turkeyAdapter);
	}
 
	static void testDuck(Duck duck) {
		duck.quack();
		duck.fly();
	}
}

 

效果:

The Turkey says...
Gobble gobble
I'm flying a short distance

The Duck says...
Quack
I'm flying

The TurkeyAdapter says...
Gobble gobble
I'm flying a short distance
I'm flying a short distance
I'm flying a short distance
I'm flying a short distance
I'm flying a short distance

 

 

适配器模式解析:
 

从上面的图中可以看出客户使用适配器的过程:

1)、客户通过目标接口调用适配器的方法对适配器发出请求。

2)、适配器使用被适配者接口把请求转化成被适配者的一个或多个调用接口。

3)、客户接收到调用的结果,但并未察觉这是适配器在起转换作用。

应该注意的地方:

1)、适配器需要做的工作与目标接口的大小成正比,接口越大,需要做的工作越多。

2)、根据实际需要我们可以让适配器实现好几个接口。一句话,要灵活使用模式。

类适配器的代码与对象适配器的代码类似,可以参考结构图仿照着写出来,这里不赘述。

下面说说对象适配器与类似配器的区别

1)、对象适配器使用组合,更富有弹性;类适配器使用继承。

2)、对象适配器可以适配被适配者的子类;类适配器只能覆盖被适配者的行为。

适配器模式的适用性

1)、你想使用一个已经存在的类,而它的接口不符合你的需求。

2)、你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。

3)、你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。

分享到:
评论

相关推荐

    Head.First 设计模式学习笔记.pdf

    ### Head.First 设计模式学习笔记知识点总结 #### 一、设计模式概述 设计模式是一种用于解决软件设计中常见问题的标准化方法。通过采用设计模式,开发者可以提高代码的复用性、灵活性和可维护性。《Head First 设计...

    HeadFirst设计模式学习笔记

    《HeadFirst设计模式学习笔记》是一份详尽的资料,旨在帮助读者深入理解并掌握设计模式这一编程领域的核心概念。设计模式是软件工程中的一种最佳实践,它在解决常见问题时提供了一种标准的解决方案,使得代码更易于...

    Head First设计模式读书笔记-DesignPatterns.zip

    《Head First设计模式》是一本深受开发者喜爱的设计模式学习书籍,它以易懂且生动的方式介绍了23种经典设计模式。这些模式是软件工程中经过实践验证的最佳实践,旨在提高代码的可重用性、可读性和可维护性。下面,...

    Head First 设计模式学习笔记(十四)模式的组合使用

    在《Head First 设计模式学习笔记(十四)模式的组合使用》中,作者探讨了如何在实际编程中灵活地组合多种设计模式以解决复杂问题。这篇文章可能是基于《Head First 设计模式》这本书的一个章节,该书是设计模式领域...

    Head First 设计模式 扫描版

    《Head First 设计模式》是软件开发领域内一本广受欢迎的书籍,由Eric Freeman、Elisabeth Robson、Bert Bates和Kathy Sierra四位作者共同撰写。这本书以其独特的视觉风格和易于理解的教学方法,深入浅出地介绍了...

    HeadFirst设计模式笔记

    《HeadFirst设计模式笔记》是深入理解软件设计思想的一份宝贵资料,主要涵盖了设计模式的基础理论和实际应用。设计模式是软件开发中的经验总结,它为解决常见的编程问题提供了标准的解决方案,使得代码更具可读性、...

    head first 设计模式

    通过以上对“Head First设计模式”书中可能涉及的设计模式的介绍,我们可以看出这本书是学习面向对象设计模式的绝佳资源。无论是初学者还是有一定经验的开发人员,都能从中受益匪浅。理解并熟练运用这些模式能够帮助...

Global site tag (gtag.js) - Google Analytics