Java设计模式菜鸟系列(十四)代理模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39856435


代理模式(Proxy):代理模式其实就是多一个代理类出来,替原对象进行一些操作。比如咱有的时候打官司需要请律师,因为律师在法律方面有专长,可以替咱进行操作表达咱的想法,这就是代理的意思。代理模式分为两类:1、静态代理(不使用jdk里面的方法);2、动态代理(使用jdk里面的InvocationHandler和Proxy)。下面请看示例:

一、静态代理

1、uml建模:



2、代码实现

/**
 * 示例(一):代理模式 --静态代理(没有调用JDK里面的方法)
 * 
 * 目标接口
 */

interface Targetable {
	public void targetMethod();
}

class Target implements Targetable {

	@Override
	public void targetMethod() {
		System.out.println("this is a target method...");
	}
}

class Proxy implements Targetable {
	private Target target;

	public Proxy() {
		this.target = new Target();
	}

	private void beforeMethod() {
		System.out.println("this is a method before proxy...");
	}

	private void afterMethod() {
		System.out.println("this is a method after proxy...");
	}

	/**
	 * 在执行目标方法前后加了逻辑
	 */
	@Override
	public void targetMethod() {
		beforeMethod();
		target.targetMethod();
		afterMethod();
	}
}

/**
 * 客户端测试类
 * 
 * @author Leo
 */
public class Test {
	public static void main(String[] args) {
		/**
		 * 创建代理对象
		 */
		Targetable proxy = new Proxy();
		/**
		 * 执行代理方法
		 */
		proxy.targetMethod();
	}
}

二、动态代理

1、uml建模:



2、代码实现

/**
 * 示例(二):代理模式 --动态代理
 * 
 * 以添加用户为例
 */
class User {
	private String username;
	private String password;

	public User() {
	}

	public User(String username, String password) {
		this.username = username;
		this.password = password;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	@Override
	public String toString() {
		return "User [username=" + username + ", password=" + password + "]";
	}
}

/**
 * 目标接口
 */
interface IUserDao {
	public void add(User user);
}

class UserDaoImpl implements IUserDao {
	@Override
	public void add(User user) {
		System.out.println("add a user successfully...");
	}
}

/**
 * 日志类 --> 待织入的Log类
 */
class LogEmbed implements InvocationHandler {
	private IUserDao target;

	/**
	 * 对target进行封装
	 */
	public IUserDao getTarget() {
		return target;
	}

	public void setTarget(IUserDao target) {
		this.target = target;
	}

	private void beforeMethod() {
		System.out.println("add start...");
	}

	private void afterMethod() {
		System.out.println("add end...");
	}

	/**
	 * 这里用到了反射
	 * 
	 * proxy 代理对象
	 * 
	 * method 目标方法
	 * 
	 * args 目标方法里面参数列表
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		beforeMethod();
		// 回调目标对象的方法
		method.invoke(target, args);
		System.out.println("LogEmbed --invoke-> method = " + method.getName());
		afterMethod();
		return null;
	}
}

/**
 * 客户端测试类
 * 
 * @author Leo
 */
public class Test {
	public static void main(String[] args) {
		IUserDao userDao = new UserDaoImpl();
		LogEmbed log = new LogEmbed();
		log.setTarget(userDao);
		/**
		 * 根据实现的接口产生代理
		 */
		IUserDao userDaoProxy = (IUserDao) Proxy.newProxyInstance(userDao
				.getClass().getClassLoader(), userDao.getClass()
				.getInterfaces(), log);
		/**
		 * 注意:这里在调用IUserDao接口里的add方法时,
		 * 代理对象会帮我们调用实现了InvocationHandler接口的LogEmbed类的invoke方法。
		 * 
		 * 这样做,是不是有点像Spring里面的拦截器呢?
		 */
		userDaoProxy.add(new User("张三", "123"));
	}
}

三、总结

代理模式好处:1、一个代理类调用原有的方法,且对产生的结果进行控制。2、可以将功能划分的更加清晰,有助于后期维护。


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java设计模式是一种在软件开发中被广泛应用的方法论,旨在解决常见的设计问题并提供可重用的解决方案。设计模式可以帮助开发人员更好地组织和架构代码,提高代码的可读性、可维护性和可扩展性。 在Java中,设计模式的用法可以通过引用中的教程来学习和理解。该教程提供了详细的设计模式介绍和示例代码,包括创模式(如单例模式、工厂模式、抽象工厂模式等)、结构型模式(如适配器模式、装饰器模式代理模式等)和行为型模式(如观察者模式、策略模式板方法模式等)。 除了设计模式本身的使用,还可以通过引用中的LandAnimal.java和引用中的Function.java来了解接口的使用。接口是Java中一种定义抽象方法的方式,它可以被类实现并提供具体的实现逻辑。在设计模式中,接口常常被用于定义抽象的行为或功能,使得不同的类可以实现同一个接口,从而实现相同的功能。 总结起来,Java设计模式的用法包括学习和理解各种设计模式的概念和应用场景,并通过实现接口来实现具体的功能。通过掌握设计模式,开发人员可以更好地设计和构高质量的软件系统。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Java常用10种设计模式详解](https://blog.csdn.net/qq_33706840/article/details/81631762)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值