java设计模式三实例举例

静态代理代码实例

下面是业务接口:

// 业务接口
public interface IUserDao {
	// 新增数据
	void save();
}

下面是目标对象的实现类:

// 实现接口
public class UserDao implements IUserDao{

	@Override
	public void save() {
		System.out.println("保存数据...");
	}
}

下面是代理对象的实现类:

// 静态代理类
public class UserDaoProxy implements IUserDao{
	// 接收目标对象
	private IUserDao target;
	public UserDaoProxy(IUserDao target) {
		this.target = target;
	}
	// 代理方法
	@Override
	public void save() {
		// 调用目标方法前的处理
		System.out.println("开始代理....");
		// 调用目标方法
		target.save();
		// 调用目标方法后的处理
		System.out.println("结束代理...");
	}
}

下面是测试类:

public class TestProxy {
	public static void main(String[] args) {
		// 目标对象
		IUserDao target = new UserDao();
		// 创建代理对象,把目标对象传递给代理对象,建立代理关系
		IUserDao proxy = new UserDaoProxy(target);
		// 执行代理操作的方法
		proxy.save();
	}
}

动态代理代码实例

下面是业务接口:

// 业务接口
public interface IUserDao {
	void save();
	int update(int id);
}

下面是业务接口实现类目标类:

// 被代理对象
public class UserDao implements IUserDao{

	@Override
	public void save() {
		System.out.println("保存数据...");
	}

	@Override
	public int update(int id) {
		return id;
	}
}

下面是invocationhandler实现类,写具体逻辑:

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

// 创建Invocation接口的实现类,在invoke方法中实现代理逻辑
public class MyInvocationHandler implements InvocationHandler{
	// 被代理对象(目标对象)
	private Object target;
	public MyInvocationHandler(Object target) {
		this.target = target;
	}
	// 实现具体的代理逻辑
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("开始执行..." + method.getName() + "方法");
		// 执行目标对象的相关方法save()
		Object returnObj = method.invoke(target, args);
		System.out.println("结束执行..." + method.getName() + "方法");
		return returnObj;
	}
}

下面是获取代理对象的类,使用newProxyInstance()方法:

import java.lang.reflect.Proxy;

// 生产代理对象的工厂
public class ProxyFactory {
	/**
	 * 方法描述:获取代理对象
	 * @param target 目标对象
	 * @return 代理对象
	 */
	public static Object getProxy(Object target) {
		// 创建一个InvocationHandler实现类的对象,会触发事件处理器的方法,会吧当前执行目标对象作为形参传入
		MyInvocationHandler handler = new MyInvocationHandler(target);
		// 通过Proxy中的静态方法newProxyInstance创建代理对象
		Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), 
				target.getClass().getInterfaces(), handler);
		// 返回代理对象
		return proxy;
		
		//jdk8的处理方式 Lambda表达式
		/*return Proxy.newProxyInstance(target.getClass().getClassLoader(),
				target.getClass().getInterfaces(),
				(proxy,method,args)->{
					System.out.println("开始执行..." + method.getName() + "方法");
					// 执行目标对象的相关方法save()
					Object returnObj = method.invoke(target, args);
					System.out.println("结束执行..." + method.getName() + "方法");
					return returnObj;
				});*/
	}
}

下面是动态代理的测试类:

public class TestProxy {
	public static void main(String[] args) {
		// 目标对象
		IUserDao target = new UserDao();
		System.out.println(target.getClass());
		// 根据目标对象生成代理对象
		IUserDao proxy = (IUserDao)ProxyFactory.getProxy(target);
		System.out.println(proxy.getClass());
		// 使用代理对象执行方法调用
		proxy.save();
		int result = proxy.update(1);
		System.out.println(result);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值