写在前面 AOP
AOP:Aspect Oriented Programming 面向切面编程, 实现的是核心业务和非核心业务之间的分离,让核心类只做核心业务,代理类只做非核心业务。
目的:把核心业务和非核心业务进行分离.并把多个非核心业务处理(点)变成一个切面(之前的非核心业务代码需要写多次变成只需要写一次。)
静态代理
- 需要知道核心类(被代理类)是哪一个类,并且有什么方法。
- 非核心的代码需要重复写多次,显得代码的结构臃肿,形成代码冗余。
- 非核心类(代理类)需要实现核心类(被代理类)实现的接口,也就是他们需要实现共同的接口,但是以核心类实现的接口(被代理类)为准。
静态代理实例
package com.wow.StaticProxyTest;
public interface GothamCityInfo {
public void theProtectorInfo(String name);
public void thePoliceInfo(String name);
public void theJohnDoeInfo(String name);
}
package com.wow.StaticProxyTest;
public class JokerInfo implements GothamCityInfo{
@Override
public void theProtectorInfo(String name) {
System.out.println("小丑和"+name+"又在调皮捣蛋了......");
}
@Override
public void thePoliceInfo(String name) {
System.out.println("小丑和"+name+"又去警察局卖香蕉了......");
}
@Override
public void theJohnDoeInfo(String name) {
System.out.println("小丑和"+name+"打赌戈登知道蝙蝠侠是谁......");
}
}
package com.wow.StaticProxyTest;
public class DarkKnightInfo implements GothamCityInfo {
private JokerInfo joker ;
public DarkKnightInfo(){}
public DarkKnightInfo(JokerInfo joker){
super();
this.joker = joker;
}
public void setJoker(JokerInfo joker) {
this.joker = joker;
}
@Override
public void theProtectorInfo(String name) {
System.out.println("蝙蝠侠:超人不让我起床");
System.out.println("蝙蝠侠:蝙蝠车今天没加油");
System.out.println("蝙蝠侠:卧槽 猫女来查岗了");
System.out.println("蝙蝠侠:媳妇我错了....");
System.out.println("-----------------");
joker.theProtectorInfo(name);
System.out.println("-----------------");
}
@Override
public void thePoliceInfo(String name) {
System.out.println("蝙蝠侠:蜘蛛侠不让我起床");
System.out.println("蝙蝠侠:蜘蛛车今天没加油");
System.out.println("蝙蝠侠:卧槽 猫女来查岗了");
System.out.println("蝙蝠侠:媳妇我错了....");
System.out.println("-----------------");
joker.thePoliceInfo(name);
System.out.println("-----------------");
}
@Override
public void theJohnDoeInfo(String name) {
System.out.println("蝙蝠侠:钢铁侠不让我起床");
System.out.println("蝙蝠侠:钢铁侠今天没加油");
System.out.println("蝙蝠侠:卧槽 猫女来查岗了");
System.out.println("蝙蝠侠:媳妇我错了....");
System.out.println("-----------------");
joker.theJohnDoeInfo(name);
System.out.println("-----------------");
}
}
package com.wow.StaticProxyTest;
public class InfoTest {
public static void main(String[] args) {
DarkKnightInfo dark = new DarkKnightInfo(new JokerInfo());
dark.theJohnDoeInfo("哈莉");
dark.thePoliceInfo("哈莉");
dark.theProtectorInfo("哈莉");
}
}
打印结果
蝙蝠侠:钢铁侠不让我起床
蝙蝠侠:钢铁侠今天没加油
蝙蝠侠:卧槽 猫女来查岗了
蝙蝠侠:媳妇我错了....
-----------------
小丑和哈莉打赌戈登知道蝙蝠侠是谁......
-----------------
蝙蝠侠:蜘蛛侠不让我起床
蝙蝠侠:蜘蛛车今天没加油
蝙蝠侠:卧槽 猫女来查岗了
蝙蝠侠:媳妇我错了....
-----------------
小丑和哈莉又去警察局卖香蕉了......
-----------------
蝙蝠侠:超人不让我起床
蝙蝠侠:蝙蝠车今天没加油
蝙蝠侠:卧槽 猫女来查岗了
蝙蝠侠:媳妇我错了....
-----------------
小丑和哈莉又在调皮捣蛋了......
-----------------
其实 静态代理在某种程度上重复了很多动作 如果需要的业务的多了起来 那么代理的量是恐怖的 而且一旦某一部分需要改动 那么改动的觉得绝对是疯狂的所以 动态代理很好的解决了这个问题 也是AOP主要核心之一。