码迷,mamicode.com
首页 > 编程语言 > 详细

Java中动态代理、装饰模式和继承简单实现

时间:2018-07-22 23:36:09      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:对象   实现   method   class   this   instance   sign   装饰者   except   

继承

被增强的对象固定的
增强的内容也是固定的

装饰者模式

被增强的对象是可以切换的
增强的内容是固定的

还有一种更加灵活的方式,面向切面编程(AOP) ,比装饰者模式更加灵活, 被增强的对象和增强的内容都是可以更换的.

package cn.ph.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//使用代理模式
public class MyCar {
    public static void main(String[] args) {
    // Object java.lang.reflect.Proxy.newProxyInstance
    // (ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException
    // 参数类型
    /**
     * param1:告诉虚拟机用哪个字节码加载器加载对应的字节码文件,固定值
     * param2:告诉虚拟机正在被创建的字节码有哪些方法
     * param3:告诉虚拟机正在被创建的字节码文件的各个方法如何处理
     * 编译过后会生成对应的代理文件  MyCar$1.class
     */
    Car car = (Car) Proxy.newProxyInstance(MyCar.class.getClassLoader(), GoogleCar.class.getInterfaces(),
            new InvocationHandler() {

                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    // 每个方法中执行的代码
                    if ("start".equals(method.getName())) {// method.getName().equalsIgnoreCase("start") //忽略大小写
                        System.out.println(method.getName());// 增强start方法
                    }
                    method.invoke(new GoogleCar());
                    return null;
                }
            });
    car.start();// 执行上面invoke方法
    car.run();
    car.stop();

}

}
//引用装饰者模式
class TestCar implements Car {
private Car car;

public TestCar(Car car) {
    this.car = car;
}

@Override
public void run() {
    car.run();
}

@Override
public void start() {
    System.out.println("查看天气");
    System.out.println("检查路况");
    car.start();
}

@Override
public void stop() {
    car.stop();
}

}

class GoogleCar implements Car {

@Override
public void start() {
    System.out.println("车启动了");
}

@Override
public void run() {
    System.out.println("车运行了");

}

@Override
    public void stop() {
    System.out.println("车停止了");

    }

}

interface Car {
    void start();
    void run();
void stop();
}

Java中动态代理、装饰模式和继承简单实现

标签:对象   实现   method   class   this   instance   sign   装饰者   except   

原文地址:https://www.cnblogs.com/hirampeng/p/9351749.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!