java静态代理设计和实现

静态代理其实就是一个代理类,然后有被代理的类。静态代理能被代理的类已经知道好了,就好比一个房子中介,已经知道哪些人房子在这被代理。客户然后去租房子,然后找代理商。代理商和被代理的客户直接联系。客户需要租房子只是和代理商打交道,但是实际客户是租被代理的人的房子;

抽象代理角色:(知道能代理哪些功能,这里的功能和具体被代理角色的功能只能说有调用功能:最后完成操作的还是具体被代理角色)

public abstract class Subject
{
	public abstract void request();
}

具体被代理角色:(正真和谁完成交易)

public class RealSubject extends Subject
{
	
	public void request()
	{
		System.out.println("这个房子是我的!!");
	}


}

代理角色:(代理被代理角色,能够在功能上就是被代理的人的功能,但实际不是他,他只是拥有权限而已)

public class ProxySubject extends Subject
{

	private RealSubject realSubject;//代理角色内部引用真实角色
	public void request()
	{
		this.preRequest();//在角色操作之前所附加的操作
		if(realSubject == null)
		{
			realSubject = new RealSubject();
		}
		this.realSubject.request();//真实角色所完成的事情
		
		this.postRequest();//在角色操作后所附加的操作
	}
	private void preRequest()
	{
		System.out.println("pre requset");
	}
	private void postRequest()
	{
		System.out.println("post request");
	}

}

客户端测试:(更具抽象代理角色知道能代理哪些功能(接口中有的,因为具体代理角色中实现 了抽象角色))

public class Client
{
	public static void main(String[] args)
	{
		Subject subject = new ProxySubject();
		//父类型的引用指向子类型的对象,所以下面调用request方法的时候在父类Subject中必须有这个方法,但是最终还是调用ProxySubject里面的方法
		//在这个代理类(ProxySubject)中就有被代理类(realSubject)的引用,并且代理类和被代理类
		//共同继承一个接口(subject),所以下面的这个方法在代理类中有这个方法,但是这个方法实现的就是对被
		//代理类的调用
		subject.request();
		//因为真正实现这个方法的类是在那个真实类中的方法,这个类里面的request()方法没有具体操作,就是一个调用
		
//		这个和策略模式区别。策略模式其实就是多态的用途,传什么进去那么最终调用的就是什么对象的方法。传宝马,最后就是宝马的方法,
//		传奥迪就调用奥迪的方法。而且策略这模式的environment这个角色不需要去实现公众接口。在这个类中有一个构造方法,当我构建
//		的时候穿宝马,然后最后调用就是宝马。
//		而代理首先用户不知道最后谁处理,这个代理类去new出来那个真实的类。只有代理类知道具体谁去执行。而策略模式则是用户传什么进去,就调用的是什么的方法
	}
	
}

猜你喜欢

转载自blog.csdn.net/qq_28081081/article/details/80470369