设计模式——(代理模式)

近期着实的想回顾一下自己已经忘得差不多的设计模式

先从代理模式开始吧
  1. 代理模式:简单的讲代理就是中介,中间人。法律上也有代理,比如代理律师之类,委托人将自己的一部分权限委托给代理者,代理者就拥有被代理者(委托人)的部分权限,并且可以以被代理人的名义来实行这些权限,此时代理者与委托人等同,当然代理人也可以在实行权限时配合自己的能力来进行,当然不能超出这个权限。
      Java中的代理模式类似于上面的代理,我们也是为一个类(委托类)创建一个代理类,来代表它来对外提供功能。
      如何在Java中创建一个类的代理类呢?
      很简单,我们需要创建一个公共接口,委托类要实现这个接口,再创建一个接口的实现类作为代理类,在这个类中的方法中可以直接调用委托类中的同名方法,外部类要进行访问时,可以使用接口指向代理类实例,调用代理类中的方法,从而间接调用委托类中的具体方法实现。
  2. 我们就以法律上的委托代理为例来写个实例:
/* 定义人这个接口*/
public interface Person{
public void doSomething();
}

然后我们再来生成委托人类

/*委托人*/
public class Wtr implements Person{
@Override
public void doSomething(){
	System.out.print("我再让我律师给你交谈");
}
}

最后我们来让律师执行

/*律师类*/
public class Ls implement Person{
private Person p;
public Ls(Person p){
this.p = p;
}
@Override
public void doSomething(){
	p.doSomething();
}
}
  1. 当然代理还分为动态代理以及静态代理
    静态代理
    以上面代码为例:
    public staitc void main(String [] args){
    	//s为被代理的对象,某些情况下 我们不希望修改已有的代码,我们采用代理来间接访问
    	Wtr s = new Wtr ();
    	//创建代理类对象
    	Ls proxy = new Ls(s);
    	//调用代理类对象的方法
          proxy.doSomething();
    }
    
    输出的结构为:我再让我律师给你交谈
    静态代理看起来是比较简单的,没有什么问题只不过是在代理类中引入了被代理类的对象而已。
    动态代理:若是动态代理,他可以代理多个不通的委托类
/**
 * 动态代理,动态代理类不要显示的实现被代理类所实现的接口
 * @author yujie.wang
 *
 */
public class MyInvocationHandler implements InvocationHandler{
	private Object object;
	public MyInvocationHandler(Object object){
		this.object = object;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("我插一句,我开始叙述了:");
		method.invoke(object, args);
		System.out.println("我叙述完毕!");
		return null;
	}
}

代理类:


public class PersonProxy {
	private Object target;
	private InvocationHandler ph;
	public PersonProxy(Object target,InvocationHandler ph){
		this.target = target;
		this.ph = ph;
	}
	
	public Object getPersonProxy(){
		Object p = Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),ph);
		return p;
	}
}

测试类:

/**
 * 测试类
 */
public class App {
    public static void main(String[] args) {
        // 目标对象
        Wtr target = new Wtr ();
        InvocationHandler inv = new MyInvocationHandler(target);
        // 给目标对象,创建代理对象
        Person proxy = (Person) new PersonProxy(target,inv).getPersonProxy();
        // class $Proxy0   内存中动态生成的代理对象
        // 执行方法   【代理对象】
        proxy.doSomething();
    }
}

输出结果为:

我插一句,我开始叙述了:
我再让我律师给你交谈
我叙述完毕!

ps:我们所熟悉的springAop切面也是通过动态代理所实现的。

猜你喜欢

转载自blog.csdn.net/qq_35340980/article/details/84389857