设计模式(七)——适配器模式

将现有接口转化为客户类期望的接口,这样保证了对现有类的重用。在适配器模式中可以定义一个包装类,包装不兼容接口的对象,这个包装类指的就是适配器。当客户端调用适配器的方法时,在适配器类的内部将调用适配者类(被包装的对象)的方法,而这个过程对客户类是透明的,客户类并不直接访问适配者类。因此,适配器可以使由于接口不兼容而不能交互的类可以一起工作,这就是适配器模式的模式动机。
适配器模式包含:目标抽象类,适配器类,适配者类。

//目标抽象类
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("具体业务三");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值