适配器模式浅谈

继上篇策略模式,可以引出一个叫做适配器模式的设计模式
先看下面的代码,还是上篇策略模式的代码段

interface Process{
    public void process(File file);
}
public class Test{
    public static void walkDir(Process p,File file){
        File[] files = file.listFiles();
        for(File ff : files){
            if(ff.isDirectory()){
                    walkDir(p,ff);
            }
            //这里就把遍历文件的代码与处理文件的代码分离开了
            p.process(ff);
        }
    }
    public static void main(String[] args){
        Process p1 = new Process(){
            public void process(File file){
                System.out.println(ff.getAbsolutePath());
                //p1 处理器,只是简单的输出文件的绝对路径;
            }
        };
        Process p2 = new Process(){
            public void process(File file){
                private count = 0;
                String path = file.getAbsolutePath();
                int index = path.lastIndexOf("\\");
                String str = path.substring(0,index);
                file.renameTo(new File(str+ "/" + count));
                count++;
                //p2处理器,将遍历到的文件名字改成相关数字
            }
        };
        //如果想用p2,只需要将下面的第一个参数改成p2,就可以了
        walkDir(p1,new File("E:/abc"));
    }
}

在给walkDir()传的第一个参数(p1、p2…),都我们自己定义的类
那如果是这个类不是我们自己定义的,而是发现的,比如系统内置的java.util.Date类呢,它并没有实现Process接口,也不可能实现这个接口
因为系统内置的类我们改不了,我们手里只有系统生成好的可怜的class文件
肿么办??现在我非要传个Date类进去,这个时候,适配器就可以解决这个问题
看下面的代码:

class DateAdapter implements Process{
    private Date date;
    public DateAdapter(Date date){
        this.date = date;
    }
    public void process(File file){
        System.out.println(file.getName() + ":" +date.getDate());
    }
}

OK,现在做出了一个DateAdapter,把Date传进去,实现Process接口,所以现在处理过程中还可以用Date去处理,这就叫适配,这样一适配,任何类都可以去处理文件了
现在这样给walkDir()传参数:

walkDir(new DateAdapter(new Date()),new File("E:/abc"));

总结一下,如果一个类是你发现的,而发现的类自己又改不了,自定义的类才能改,这个时候去用发现的类去处理相关的过程,就用到了适配器模式
个人浅谈,有误地方,多多指教

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值