代理模式与AOP实现

代理模式

需求:每个明星都有经纪人,客户通过与经纪人进行交流签合同等,而明星只负责表演。

       1.静态代理

            代理模式与AOP实现

       用户不用再去与明星直接谈,而是与经纪人谈,由经纪人去与让明星演出。

代码实现:

//事务接口
public interface Yan {
	void yuYue();
	void qianHeTong();
	void Yachu();
	void geiQian();
}


//明星类
public class Star implements Yan{

	@Override
	public void yuYue() {
	}

	@Override
	public void qianHeTong() {
	}

	@Override
	public void Yachu() {
		System.out.println("Star唱歌");
	}

	@Override
	public void geiQian() {
	}

}


//代理类
public class DaiLi implements Yan{
	private Star star ;
	public DaiLi(Star star) {
		this.star=star;
	}
	
	@Override
	public void yuYue() {
		System.out.println("DaiLi预约");
	}

	@Override
	public void qianHeTong() {
		System.out.println("DaiLi签合同");
	}

	@Override
	public void Yachu() {
		star.Yachu();
	}

	@Override
	public void geiQian() {
		System.out.println("DaiLi给钱");
	}

}

//测试类
public class Test {
	public static void main(String[] args) {
		Star star = new Star();
		DaiLi da = new DaiLi(star);
		da.yuYue();
		da.qianHeTong();
		da.Yachu();
		da.geiQian();
	}
}

 静态代理总结:

         优点:可以在不修改原对象的基础上进行拓展与拦截

        缺点:因为都实现了相同的接口,不易于维护。

     2.动态代理

       代理模式与AOP实现

   代码实现:

//事务接口
public interface Yan {
	void yuYue();
	void qianHeTong();
	void Yachu();
	void geiQian();
}


//代理类
public class DaiLi implements Yan{
	@Override
	public void yuYue() {
		System.out.println("DaiLi预约");
	}

	@Override
	public void qianHeTong() {
		System.out.println("DaiLi签合同");
	}

	@Override
	public void Yachu() {
		
	}

	@Override
	public void geiQian() {
		System.out.println("DaiLi给钱");
	}

}

//代理类
public class DaiLi implements Yan{
	@Override
	public void yuYue() {
		System.out.println("DaiLi预约");
	}

	@Override
	public void qianHeTong() {
		System.out.println("DaiLi签合同");
	}

	@Override
	public void Yachu() {
		
	}

	@Override
	public void geiQian() {
		System.out.println("DaiLi给钱");
	}

}

//handler类
public class YanHandler implements InvocationHandler{
	private Star star;
	private DaiLi da;
	public YanHandler(Star star, DaiLi da) {
		super();
		this.star = star;
		this.da = da;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		if(method.getName().equals("Yachu")) {
			da.yuYue();
			da.qianHeTong();
			method.invoke(star, args);
			da.geiQian();
		}
 		return null; 
	}

}

//测试类
public class Client {
	public static void main(String[] args) {
		Star star = new Star();
		DaiLi da = new DaiLi();
		YanHandler handlier = new YanHandler(star,da);
		Yan proxy=(Yan) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[] {Yan.class}, handlier);
		proxy.Yachu();
	}
}

动态代理总结:

    这样就可以把我们要重复做的逻辑抽出来,在handler里边统一控制。

3.AOP思想

   aop是基于动态代理实现的把各个事务通过给单独抽出来,然后通过配置去寻找他的前置,后置,异常等方法。