代理模式与AOP实现
代理模式
需求:每个明星都有经纪人,客户通过与经纪人进行交流签合同等,而明星只负责表演。
1.静态代理
用户不用再去与明星直接谈,而是与经纪人谈,由经纪人去与让明星演出。
代码实现:
//事务接口
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.动态代理
代码实现:
//事务接口
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是基于动态代理实现的把各个事务通过给单独抽出来,然后通过配置去寻找他的前置,后置,异常等方法。