Java 23种设计模式之:适配器模式

一、案例引入 

现设计一个可以模拟各种动物行为的仿生机器人,再机器人中定义了一系列方法,如机器人叫喊方法cry(),机器人飞翔方法fly()等等。如果希望在不修改已有Dog与Bird类代码基础上使得机器人也能像狗一样叫,像鸟一样飞,试设计该系统

二、案例分析

根据适配器模式结构,客户端需要调用Dog类的cry()方法和Bird类的fly()方法,而Bird和Dog类(适配者类)均没有同时包含这两个方法,但是它各自提供的cry()和fly()方法却是客户端所需要的

为了使客户端能够使用适配者类,需要提供一个适配器类Adapter。该类包装了一个适配者的实例,从而将客户端与适配者衔接起来,在适配器的cry()和fly()方法中调用适配者的cry()和fly()方法

三、模式动机

我的笔记本电脑的工作电压是20V,而我国的家庭用电是220V,如何让20V的笔记本电脑能够在220V的电压下工作?答案是引入一个电源适配器(AC Adapter)

在软件开发中采用类似于电源适配器的设计和编码技巧被称为适配器模式

在适配器模式中可以定义一个包装类,包装不兼容接口的对象,这个包装类指的就是适配器(Adapter),它所包装的对象就是适配者(Adaptee),即被适配的类。

适配器提供客户类需要的接口,适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用

当客户类调用适配器的方法时,在适配器类的内部将调用适配者类的方法而这个过程对客户类是透明的客户类并不直接访问适配者类。因此,适配器可以使由于接口不兼容而不能交互的类可以一起工作

四、模式定义

将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作

五、模式结构及角色定义

Java 23种设计模式之:适配器模式_第1张图片

适配器模式包含的角色。
1)Target(目标抽象类) —— Robot.java
      目标抽象类定义客户要用的特定领域的接口,可以是个抽象类的接口,也可以是具体类;在适配器类中,由于Java语句不支持多重继承,它只能是接口。
2)Adapter(适配器)——Adapter.java
      适配器类可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,适配器Adapter是适配器模式的核心,在类适配器中,它通过实现Target接口并继承Adaptee类使二者产生联系;在对象适配器中,它通过继承Target并关联Adaptee对象使二者产生联系。(本例中使用的是对象适配器)
3)Adaptee(适配者类)——Dog.java和Bird.java
      适配者类即被适配的角色,他定义了一个已经存在的接口,这个接口需要适配。适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下甚至没有适配者类的源代码。
4)Client(客户端类)——Client.java
      在客户类中针对目标抽象类进行编程,调用在目标抽象类中定义的业务方法

六、代码部分

适配者类:Dog.java

public class Dog {
	public void cry() {
		System.out.println("小狗叫");
	}

	public void run() {
		System.out.println("小狗跑");
	}
}

适配者类:Bird.java

public class Bird {
	public void fly() {
		System.out.println("小鸟飞");
	}
}

 

目标抽象类:Robot.java

public interface Robot {
	public void cry();

	public void fly();
}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

适配器类:Adapter.java

public class Adapter implements Robot {

	Bird bird;
	Dog dog;

	public Adapter() {
		bird = new Bird();
		dog = new Dog();
	}

	@Override
	public void cry() {
		System.out.println("机器人仿生:");
		dog.cry();
	}

	@Override
	public void fly() {
		System.out.println("机器人仿生:");
		bird.fly();
	}

}

客户端测试类:Client.java

public class Client {
	public static void main(String[] args) {
		// Robot robot = (Robot) XMLUtil.getBean();
		Robot robot = (Robot) new Adapter();
		robot.cry();
		robot.fly();
	}
}

(客户端测试类可以使用配置文件)


学习视频:适配器模式

 

你可能感兴趣的:(Java,设计模式)