课堂笔记
适配器概述
适配器的引入是为了让那些由于接口不兼容而不能交互的类可以一起工作。
适配器结构
1.Target(目标抽象类)
目标抽象类定义客户需要的接口,可以是一个抽象类或接口(根据语言的类型而定,像java不支持多继承,它一般是接口)
2.Adapter(适配器类)
对Adaptee和Target进行适配,相当于我们对于继承的父类和以及实现的接口都不可见,最后只能使用Adapter类
3.Adaptee(适配者类)
被适配的角色(适配者类里都是我们想要使用的方法)
适配器的实现
博主作为一个小白刚开始被绕晕了,这里给大家强调一下。
注释:其实我们最后想要实现的是Target(接口或抽象类中的抽象方法),但是我们用得却是Adapter类,一定不要被绕进去了。
类适配器
Adapter继承Adaptee类实现Target接口。
重点:类适配器中,只能一个适配器对应一个适配者类。因为java不支持多继承。
对象适配器
Adapter类继承Target(抽象类,里面的方法全部抽象化,并在Adapter里实现),关联多个Adaptee类。
重点:对象适配器中,一个适配器可以对应多个适配者方法。
俩种特殊适配器介绍
仅作了解,读者可自己下去实现,博主不多做赘述。掌握以上核心即可。
缺省适配器
其实这东西就是为了程序员偷懒用的。
起因:当我们用类适配器是,实现target接口时,如果target接口里面方法太多,而程序员只需要用到几个方法,但又不想把方法全部实现想出来的办法
解决方法:用一个抽象类去实现Target接口,我们称这个抽象类为缺省适配器。如何我们具体的业务类去继承抽象类。
双向适配器
其实就是Adapter类与Target类和Adaptee类都是关联关系。
适配器模式应用实例(作业)
一个适配器,dog是Target,cat是Adaptee,让狗学猫抓老鼠。
类适配器写法
类图
猫作为适配者类
public class Adaptee {
public void catchMouse(){
System.out.println("catch mice");
}
}
狗作为目标抽象类
public interface Target {
public void CATCH();
}
适配器
public class Adapter extends Adaptee implements Target {
@Override
public void CATCH() {
super.catchMouse();
}
}
客户端:在强调一边我们是接口,只有接口时可见的,适配器我们不可见。
public class client {
public static void main(String[] args) {
Target adapter=new Adapter();
adapter.CATCH();
}
}
对象适配器写法
类图
猫 适配者类
public class Adaptee {
public void catchMouse(){
System.out.println("catch mice");
}
}
狗 目标抽象类
public abstract class Target {
public abstract void CATCH();
}
适配器
public class Adapter extends Target {
private Adaptee adaptee;
@Override
public void CATCH() {
adaptee=new Adaptee();
adaptee.catchMouse();
}
}
适配器实验
- 在中国网建http://sms.webchinese.com.cn注册,获得用户名和短信密钥:
- 验证短信发送代码,需把commons-codec-1.4.jar,commons-httpclient-3.1.jar,commons-logging-1.1.1.jar三个JAR文件build Path到实验项目里。(验证Adaptee功能)
- 验证成功后,定义对象适配器,使得Client通过Target接口发送短信。(与不兼容的接口一起工作)
- 思考:如何适配更多的短信平台如网易、腾讯云等。
类图
注意这里你需要导入三个包
展示Target
package adapter;
import java.io.IOException;
public class Target {
public void sendSMS() throws IOException {}
}
package adapter;
import java.io.IOException;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
public class Adaptee {
// 测试短信的发送
// public static void main(String[] args)throws Exception{
//
// HttpClient client = new HttpClient();
// PostMethod post = new PostMethod("https://utf8api.smschinese.cn/");
// post.addRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");//在头文件中设置转码
// NameValuePair[] data ={ new NameValuePair("Uid", "本站用户名"),new NameValuePair("Key", "接口安全密码"),new NameValuePair("smsMob","手机号码"),new NameValuePair("smsText","验证码:8888")};
// post.setRequestBody(data);
//
// client.executeMethod(post);
// Header[] headers = post.getResponseHeaders();
// int statusCode = post.getStatusCode();
// System.out.println("statusCode:"+statusCode); //HTTP状态码
// for(Header h : headers){
// System.out.println(h.toString());
// }
// String result = new String(post.getResponseBodyAsString().getBytes("utf-8"));
// System.out.println(result); //打印返回消息状态
//
// post.releaseConnection();
//
// }
public void transmit() throws IOException {
; HttpClient client = new HttpClient();
PostMethod post = new PostMethod("https://utf8api.smschinese.cn/");
post.addRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");//在头文件中设置转码
NameValuePair[] data ={ new NameValuePair("Uid", "本站用户名"),new NameValuePair("Key", "接口安全密码"),new NameValuePair("smsMob","手机号码"),new NameValuePair("smsText","验证码:8888")};
post.setRequestBody(data);
client.executeMethod(post);
Header[] headers = post.getResponseHeaders();
int statusCode = post.getStatusCode();
System.out.println("statusCode:"+statusCode); //HTTP状态码
for(Header h : headers){
System.out.println(h.toString());
}
String result = new String(post.getResponseBodyAsString().getBytes("utf-8"));
System.out.println(result); //打印返回消息状态
post.releaseConnection();
}
}
注意:这行代码需要你自己的信息。你需要先注册一个用户,然后再‘接口功能设置’里面找到信息
网址:中国网建
NameValuePair[] data ={ new NameValuePair("Uid", "本站用户名"),new NameValuePair("Key", "接口安全密码"),new NameValuePair("smsMob","手机号码"),new NameValuePair("smsText","验证码:8888")};