浅谈常用设计模式——适配器模式

设计模式中,适配器模式作为结构型设计模式,常常被人在项目中使用。适配器模式设计思想是将两个功能不同的接口整合起来一起使用,适配器发挥着连接的适配作用。比如电脑与内存卡,这是两个不一 样功能的载体,可以当作两个不同的接口,而读卡器(在这里就是适配器),可以连接电脑和内存卡,电脑可以通过读卡器读取内存卡,使得电脑和内卡同时工作。再比如中国的家用电压是220V,日本的家用电压是110V,为了使得电器能够在不同的电压环境下工作,电压转化器(在这里就是适配器)就发挥着连接和适配的作用。

优点:使得两个功能不同的接口可以一起工作,通过适配器类解耦目标类和适配者类,提高类的复用性。

缺点:最多只能适配一个适配者类,适配器模式中只能为目标抽象类,适配器太多会导致系统代码结构不清晰。

本文简单采用一个例子:Ipad和Iphone的文件读取功能。我们把Ipad和Iphone这两个不同功能载体当作两个不同的接口,现需要实现在Ipad中读取Iphone的文件,其中,TypeC连接线就是我们的适配器,TypeC接口连接了Ipad和Iphone,使得Ipad可以读取Iphone的文件,两者的文件都可以同时读取得到。

采用适配器模式,设计思路如下:

Ipad接口

public interface Ipad {
	public void play(String type);
}

Iphone接口

public interface Iphone {
	public void paly(String type);
}

IphoneReader类,用于读取iPhone的文件系统

package adapter;
/**
 * 该类模拟具有iPhone文件系统读取的功能
 * @author jsyuger
 */
public class IphoneReader implements Iphone {
	@Override
	public void paly(String type) {
		System.out.println("Reader reads iphone files!");
	}
}

TypeCAdapter类,适配器,用于iPad适配iPhone的文件读取

package adapter;
/**
 * 适配器,连接ipad和iPhone的typeC
 * @author jsyuger
 */
public class TypeCAdapter implements Ipad{
	//基于ipad的接口,同时适配了苹果的IphoneReader
	private IphoneReader iphoneReader = new IphoneReader();
	
	@Override
	public void play(String type) {
		iphoneReader.paly(type);
	}
}

MediaReader类,用于读取ipad的文件系统以及通过适配器读取iPhone的文件系统

package adapter;
/**
 * ipad的文件读取器,具有适配typeC接口的特点
 * 读取原理:先在ipad读取文件,若没有,则在iPhone上读取,ipad和iPhone上都没有,就报错
 * @author jsyuger
 */
public class MediaReader implements Ipad{
	@Override
	public void play(String type) {
		if(type.equals("ipad")) { //读取ipad,在ipad文件系统里面找
			System.out.println("Reader reads ipad files!");
		}else if(type.equals("iphone")) { //如果ipad文件系统没有,就调用TypeC适配器,去iphone文件系统里面找
			TypeCAdapter typeCAdapter = new TypeCAdapter();
			typeCAdapter.play(type);
		}else{ //iPhone和ipad都找不到的文件,则报错
			System.out.println("Type is not support!");
			//new Exception("Type is not support!");
		}
	}
}

Reader测试类,模拟读取文件

package adapter;

import org.junit.Test;
/**
 * 测试类,模拟读取文件
 * @author jsyuger
 */
public class Reader {
	@Test
	public void test() {
		MediaReader mediaPlayer = new MediaReader();
		mediaPlayer.play("ipad");
		mediaPlayer.play("iphone");
		mediaPlayer.play("unkowned");
	}
}

控制台输出:

Reader reads ipad files!
Reader reads iphone files!
Type is not support!

适配器模式分为对象适配器和类适配器,其设计思想和解决目标都是差不多的,都是为了兼容不同的接口使其同时工作,但有细微的实现区别,感兴趣的朋友可以了解一下。好了,水文就写到这里了,bye~

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值