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

Posted hirampeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中动态代理装饰模式和继承简单实现相关的知识,希望对你有一定的参考价值。

继承

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

装饰者模式

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

还有一种更加灵活的方式,面向切面编程(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中动态代理装饰模式和继承简单实现的主要内容,如果未能解决你的问题,请参考以下文章

Spring AOP入门基础-继承装饰者,代理的选择

增强一个对象的方法(继承装饰者模式动态代理)

Java学习之动态代理

java动态代理

java代理模式与装饰者模式

Java 代理模式和装饰者模式的区别