将现有接口转化为客户类期望的接口,这样保证了对现有类的重用。在适配器模式中可以定义一个包装类,包装不兼容接口的对象,这个包装类指的就是适配器。当客户端调用适配器的方法时,在适配器类的内部将调用适配者类(被包装的对象)的方法,而这个过程对客户类是透明的,客户类并不直接访问适配者类。因此,适配器可以使由于接口不兼容而不能交互的类可以一起工作,这就是适配器模式的模式动机。
适配器模式包含:目标抽象类,适配器类,适配者类。
//目标抽象类
public interface Robot {
public void cry();
public void move();
}
//适配者类
public class Dog {
public void wang(){
System.out.println("狗汪汪叫");
}
public void run(){
System.out.println("狗快跑");
}
}
//适配器类
public class DogAdapter extends Dog implements Robot {
@Override
public void cry() {
// TODO Auto-generated method stub
System.out.print("机器人模仿");
super.wang();
}
@Override
public void move() {
// TODO Auto-generated method stub
System.out.print("机器人模仿");
super.run();
}
}
//如果现在机器人不是模仿狗而是模仿鸟,可以很快的复用
public class Bird {
public void tweedle(){
System.out.println("鸟叫");
}
public void fly(){
System.out.println("飞翔");
}
}
//目标适配类
public abstract class DataOperation {
private String password;
public void setPassword(String password){
this.password = password;
}
public String getPassword(){
return this.password;
}
public abstract String doEncrypt(int key, String ps);
}
//适配者类
public final class Caesar {
public String doEncrypt(int key, String ps){
String es = "";
for(int i = 0; i < ps.length(); i ++){
char c = es.charAt(i);
if(c >= 'a' && c <= 'z'){
c += key %26;
if(c > 'z') c -= 26;
if(c < 'a') c += 26;
}
if(c >= 'A' && c <= 'Z'){
c += key%26;
if(c > 'Z') c -= 26;
if(c < 'a') c += 26;
}
es += c;
}
return es;
}
}
//适配器类
public class CipherAdpter extends DataOperation {
private Caesar cipher;
public CipherAdpter(){
cipher = new Caesar();
}
@Override
public String doEncrypt(int key, String ps) {
// TODO Auto-generated method stub
return cipher.doEncrypt(key, ps);
}
}
适配器模式的优点:
(1)将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无需修改原有代码。
(2)增加了类的透明性和复用性,将具体的实现封装在适配者类中,提高了适配者的复用性。
(3)通过使用配置文件,可以很方便的更换适配器,可以在不修改代码的情况下增加新的适配器类,完全符合“开闭原则”。
默认适配器模式
//适配者接口
public interface ServiceInterface {
public void serviceMethod1();
public void serviceMethod2();
public void serviceMethod3();
}
//默认适配器类
public class AbstractServiceClass implements ServiceInterface {
@Override
public void serviceMethod1() {
// TODO Auto-generated method stub
}
@Override
public void serviceMethod2() {
// TODO Auto-generated method stub
}
@Override
public void serviceMethod3() {
// TODO Auto-generated method stub
}
}
//具体业务类
public class ConcreteServiceClass extends AbstractServiceClass {
public void serviceMethod1(){
System.out.println("具体业务一");
}
public void serviceMethod3(){
System.out.println("具体业务三");
}
}