设计模式——代理设计模式

代理设计模式:两个子类共同实现一个接口,一个子类负责真实业务的实现,一个子类完成辅助真实业务主题的操作

代理设计模式的本质:所有的真实业务操作都会有一个与之辅助的工具类(功能类)共同完成。

/*
 * 静态代理设计模式的一般写法
 *代理设计模式:两个子类共同实现一个接口,
 *一个子类负责真实业务的实现,一个子类完成辅助真实业务主题的操作
 * */

//接口
interface ISubject1{
	//核心功能是买东西
	void buySomething();
}
//真实实现类
class RealPracticalClass implements ISubject1{
	public void buySomething() {
		//真实要实现的事情
		System.out.println("需要要买一个电脑");
	}	
}
//代理辅助类
class ProxyAssistClass implements ISubject1{
	//真实的操作业务
	RealPracticalClass realPracticalClass  = new RealPracticalClass();
	//构造方法
	public ProxyAssistClass(RealPracticalClass realPracticalClass) {
		super();
		this.realPracticalClass = realPracticalClass;
	}
	public void BeforeBuySomething() {
		System.out.println("买东西之前的准备工作");
	}
	public void AfterBuySomething() {
		System.out.println("买东西之后的后续工作");
	}
	public void buySomething() {
		//真实业务前期
		this.BeforeBuySomething();
		//调用真实业务
		this.realPracticalClass.buySomething();
		//真实业务执行后
		this.AfterBuySomething();
	}
}
//工厂类
class Factory1{
	public static ISubject1 getInstance() {
		//产生代理类的实例化对象并返回
		return new ProxyAssistClass(new RealPracticalClass());
	}
}
public class ProxyDesignPattern {
	public static void main(String[] args) {
		//向上转型
		ISubject1 iSubject = Factory1.getInstance();
		//调用核心功能
		iSubject.buySomething();
	}
}

                   

在我们学了反射机制后,可利用反射来取得类对象,而不用自己的定义,只需对工厂类进行修改,如下。


/*
 * 反射机制改良静态代理设计模式
 * */
//接口
interface ISubject1{
	//核心功能是买东西
	void buySomething();   实现类
}
//真实实现类
class RealPracticalClass implements ISubject1{
	public void buySomething() {
		//真实要实现的事情
		System.out.println("需要要买一个电脑");
	}	
}
//代理辅助类
class ProxyAssistClass implements ISubject1{
	//接口对象
	private ISubject1 iSubject1;
	//构造方法获取接口
	public ProxyAssistClass(ISubject1 iSubject1) {
		super();
		this.iSubject1 = iSubject1;
	}
	public void BeforeBuySomething() {
		System.out.println("买东西之前的准备工作");
	}
	public void AfterBuySomething() {
		System.out.println("买东西之后的后续工作");
	}
	public void buySomething() {
		//真实业务前期
		this.BeforeBuySomething();
		//调用真实业务
		this.iSubject1.buySomething();
		//真实业务执行后
		this.AfterBuySomething();
	}
}
////工厂类
class Factory1{
	//无参构造私有化
	private Factory1() {}
	//取得真实类对象(其包含默认的无参构造)
	public static <T> T getRealInstance(String realPathName) throws Exception {
		T  t = null;
		Class<?> class1 =Class.forName(realPathName);
		return t = (T) class1.newInstance();
	}
	//取得代理类对象
	public static <T> T getProxyInstance(String proxyPathName,String realPathName) throws Exception{
		//拿到真实类的对象
		T realClass = getRealInstance(realPathName);
		Class<?> class1 = Class.forName(proxyPathName);
		//取得代理类的构造方法
		Constructor constructor = class1.getDeclaredConstructor(class1.getInterfaces()[0]);
		T t1 = (T) constructor.newInstance(realClass);
		return t1;
	}
}
public class ProxyDesignPattern {
	public static void main(String[] args) throws Exception {
		ISubject1 iSubject1 = Factory1.getProxyInstance("reflect.ProxyAssistClass", "reflect.RealPracticalClass");
		iSubject1.buySomething();
	}
}

                

以这种代理设计只能够代理一个接口的子类对象,无法代理更 多的接口子类对象。



猜你喜欢

转载自blog.csdn.net/qq_40409115/article/details/80296140