• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
阿海在学Java
博客园    首页    新随笔    联系   管理    订阅  订阅

动态代理

  1. 代理模式

代理(Proxy)是一种设计模式,提供了目标对象另外的访问方式,就是通过代理对象访问目标对象。

这样的好处是可以给目标对象扩展功能。

这里使用到的编程思想:不要随意去修改别人的已经写好的代码或者方法,如果需要修改那么使用代理方式来扩展改方法。

举个例子:我们要请明星拍广告,我们不可能直接去和明星说,而是找经纪人来告诉他拍广告的事情。

明星只负责表演,其余的事情都是经济人来搞。用图来表示:

代理模式的关键点就是:代理对象与目标对象.代理对象是对目标对象的扩展,并且会调用目标对象。

实例场景:我想为谷歌汽车增加功能

定义一个汽车接口:

package com.itheima.car;

public interface Goodle {
    public void start();

//汽车工作
    public void run();

//汽车运行
    public void stop();
    // 汽车停止
}

实现接口里所有的方法:

package com.itheima.car;

public final class Car implements Goodle {

    @Override
    public void start() {
        // TODO Auto-generated method stub
        System.out.println("汽车工作");
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        System.out.println("汽车运行");
    }

    @Override
    public void stop() {
        // TODO Auto-generated method stub
        System.out.println("汽车停止");

    }

}

主方法:

package com.itheima.Test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import com.itheima.car.Car;
import com.itheima.car.Goodle;

public class Test {

    public static void main(String[] args) {
        Goodle car=    (Goodle) Proxy.newProxyInstance(Test.class.getClassLoader(), Car.class.getInterfaces(),new InvocationHandler() {
        //目标实现了的接口                                    本类的加载器固定的        目标对象获取已经实现的接口中的方法     匿名对象
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                // TODO Auto-generated method stub
                if (method.getName().equalsIgnoreCase("start")) {
                    //判断是不是start方法,如果是那么就添加检查天气功能和检查路况的功能
                    System.out.println("检查天气");
                    method.invoke(new Car(), args);
                    System.out.println("检查路况");
                }else {
                    
                    method.invoke(new Car(), args);
                }
                
                return null;
            }
        } );
        car.start();
        car.run();
        car.stop();
    }
}

增加功能就实现了:

你不会的东西,觉得难的东西,一定不要躲。先搞明白,后精湛,你就比别人优秀了。因为大部分人都不舍得花力气去钻研,自动淘汰,所以你执着的努力,就占了大便宜。奋斗就是每一天都很难,可一年比一年容易。不奋斗就是每一天都很容易,可一年比一年越难。怕吃苦的人吃苦一辈子,不怕吃苦的人吃苦一阵子。拼一个春夏秋冬,赢一个无悔人生
posted @ 2018-10-02 21:29  阿海在学Java  阅读(118)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3