Java_05【代理设计模式】

-介绍Java中的代理设计模式-
通过调用代理,来间接的调用实际对象。
代理是一种常用的设计模式,代理模式可以对原有的类进行扩展,即通过代理对象的模式来访问目标类。

01静态代理

在这里插入图片描述

interface Subject{
	void visit();
}
class RealSubject implements Subject{
	private String name = "RealSubject 实现类";
	public void visit(){		//覆写接口方法
		System.out.println(name);
	}
}
class ProxySubject implements Subject{			//代理类
	private Subject subject;
	public ProxySubject(Subject subject){
		this.subject=subject;
	}
	public void visit(){
		subject.visit();
	}
}
public class Test{
	public static void main(String[] args){
		ProxySubject subject = new ProxySubject(new RealSubject());
		subject.visit();
	}
}

通过代码可以直接看出代理模式特点,代理类接受一个Subject接口对象,通过代理类去访问实际访问的类
就像你去4S店买特制的汽车你无法自己直接联系汽车生产的工厂,只能通过4S店去帮你定制,这个过程称之为静态代理模式,因为这个过程是固定的,你可以委托4S店去定制,别人也可以,当对象多了之后4S店也烦啊 这么多定制车太烦了。这也是静态代理的去缺点当对象多了之后就显得十分臃肿。

02动态代理模式

动态模式是用来解决静态代理模式接口过多问题,当你每产生一个新的需求是就需要产生一个新的实际类,对应的就要随之有相应的接口,当接口过多管理起来就会产生许多问题
联系之前的工厂设计模式,我们可以用这种逻辑去解决这个问题,我们可以在从产生对象到代理类的过程中,添加一个动态代理类用来动态管理,动态对象。达到减少额外减少接口的目的
其步骤如下:
1。编写一个委托类的接口,即静态代理的(Subject接口)
2。实现一个真正的委托类,即静态代理的(RealSubject类)
3。创建一个动态代理类,实现InvocationHandler接口,并重写该invoke方法
4。在测试类中,生成动态代理的对象。
简单的
动态代理的步骤:
      1. 首先获得一个被代理对象的引用,
      2. 获得该引用的接口
      3. 生成一个类,这个类实现了我们给的代理对象所实现的接口
      4. 上述类编译生成了.class字节码供JVM使用
      5. 调用上述生成的class


interface Subject{
	void visit();
}
class RealSubject implements Subject{
	private String name = "RealSubject 实现类";
	public void visit(){		//覆写接口方法
		System.out.println(name);
	}
}
class ProxySubject implements Subject{			//代理类
	private Subject subject;
	public ProxySubject(Subject subject){
		this.subject=subject;
	}
	public void visit(){
		subject.visit();
	}
}

class DynamicProxy implements InvocationHandler{		//动态管理类
	private Object object;	
	public DynamicProxy(Object objet){
		this.object=object;
	}
	public Object invoke(Object proxy,Method method,Object[] args)throws Throwable{
		Object result = method.invoke(object,args);
		return result;
	}
}
public class Test{
	public static void main(String[] args){
			Subject realSubject = new RealSubject();
			DynamicProxy proxy = new DynamicProxy(realSubject);
			ClassLoader classLoder = realSubject.getClass().getClassLoader();
			Subject subject = (Subject)Proxy.newProxyInstance(classLoder,new Class[]{Subject.class},proxy);
			subject.visit();
	}
}

生命不息!!!奋斗不止!!!

猜你喜欢

转载自blog.csdn.net/qq_36390039/article/details/88689730