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();
}
原文地址:https://www.cnblogs.com/hirampeng/p/9351749.html