java 设计模式 —— 浅析代理模式

本文通过一个实际的爬虫案例,介绍了Java中的静态代理和动态代理。在静态代理中,通过代理类增加了被代理类的功能,但存在代码冗余和维护困难的问题。动态代理则在运行时创建,解决了静态代理的局限,可以在运行时处理被代理类的所有方法,且不限制被代理类的类型。动态代理类在Java中由`java.lang.reflect.Proxy`类生成,实现了指定接口,并通过`InvocationHandler`进行方法调用。
摘要由CSDN通过智能技术生成

静态代理业务场景

这天你早早地到了公司,打开电脑准备写代码,组里突然给你下发了一个任务,由于 java 后台组这几天有点缺人,临时需要你帮个忙,让你做一个 百度网站的爬虫,虽然你满肚子不情愿,但是又没有办法,谁让你是一个小全栈呢~

幸运的是,等你来到后台组的时候,后台的大佬告诉你基本的框架已经搭建好了,你只需要完成网页爬取的代码就行了,于是你啪啪啪打起键盘写下了如下的代码 ——

1.首先创建一个爬虫接口:

public interface Spider {
    void spider() throws IOException;
}

2.再是各个类:

public class JavaSpider implements Spider {
    private final String URL = "http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=92751549_hao_pg&wd=JAVA&oq=%25E5%258A%25A8%25E6%2580%2581%25E4%25BB%25A3%25E7%2590%2586%25E7%2594%259F%25E6%2588%2590%25E7%25B1%25BB%25E5%259C%25A8%25E5%2593%25AA%25E9%2587%258C&rsv_pq=ff31a7ae0006648a&rsv_t=3c2aOlwowmM8l8mE7hifw23DGvHmskmk4d9%2BbGw%2BmtCDL%2Ftwh2IqdiK85K07EXK8z5Z7IXOF&rqlang=cn&rsv_enter=1&rsv_sug3=4&rsv_sug1=3&rsv_sug7=100&rsv_sug2=0&inputT=1149&rsv_sug4=1149";

    @Override
    public void spider() throws IOException {
        HttpURLConnection connection = HTTPUtil.connection(URL);
        InputStream stream = connection.getInputStream();
        // 对网页的操作
        if (stream != null) {
        // 爬取各个 html 标签下的内容
            byte[] buffer = new byte[1024];
            int read = 0;
            while ((read = stream.read(buffer)) != -1) {
                System.out.print(new String(buffer, 0, read));
            }
        }
        // 插入数据到数据库中
        insert2Database();
    }

    private void insert2Database() {
        // 模拟插入数据库
        System.out.println(getClass().getName() + ": 已插入数据库\n========================");
    }
}

完毕!但你收拾正要起身的时候,突然又被后台组的老大叫住了——“我去,小超你就写完了?速度可以啊,不过我看你也不是很忙,继续帮我把其他7个子界面一起爬了吧,公司都要这些数据呢。”虽然你此时此刻想和这个后台组的老大单挑一波,但是最终还是忍住了,写写爬虫也不是很耗脑子的事情,那就继续写吧,代码如下 ——

public class AndroidSpider implements Spider {
    private final String URL = "http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=92751549_hao_pg&wd=Android&oq=JAVA&rsv_pq=d0b52cbe0003764e&rsv_t=41f18noX9t6D9n050OkCQLVTUNkKMtmZBwI4%2FpcyiEue4dfGWNK6kQzCvcdLchSNfMO25viL&rqlang=cn&rsv_enter=1&inputT=2310&rsv_sug3=11&rsv_sug1=9&rsv_sug7=100&rsv_sug2=0&rsv_sug4=2310";

    @Override
    public void spider() throws IOException {
        HttpURLConnection connection = HTTPUtil.connection(URL);
        InputStream stream = connection.getInputStream();
        // 对网页的操作
        if (stream != null) {
            // 爬取各个 html 标签下的内容
            byte[] buffer = new byte[1024];
            int read = 0;
            while ((read = stream.read(buffer)) != -1) {
                System.out.print(new String(buffer, 0, read));
            }
        }
        // 插入数据到数据库中
        insert2Database();
    }

    private void insert2Database() {
        // 模拟插入数据库
        System.out.println(getClass().getName() + ": 已插入数据库\n========================");
    }
}

public class OkHttpSpider implements Spider {
    private final String URL = "http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=92751549_hao_pg&wd=OKHTTP&oq=Android&rsv_pq=974ab7
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值