本文章适合初学者,主要是整理清楚,java , 从面向过程 到 面向对象,面向接口,面向切面。java
假如咱们正在创建一栋别墅。ide
过程:搅拌水泥,拉砖头,请工人,粉刷墙壁等等,一系列很是 琐碎的事情,this
对象:砌墙!spa
接口:这里,创建一个厕所,这里创建一个客厅!代理
切面:就这么理解吧,假如你和女朋友约会,code
周五:女朋友出门以前须要 洗澡,洗头,化妆,(吃饭),卸妆,洗澡,睡觉对象
周六:女朋友出门以前须要 洗澡,洗头,化妆,(喝饮料),卸妆,洗澡,睡觉blog
周日:女朋友出门以前须要 洗澡,洗头,化妆,(去游乐园),卸妆,洗澡,睡觉接口
你能接触的,就是很女朋友 吃喝玩乐,get
下面开始上代码:
1、第一个包,面向过程,很是简单
aop001 Test.java
package aop001; /* * 面向过程的写法,一次性把全部代码写到一块儿去 */ public class Test { public static void main(String[] args) { System.out.println("第一个女孩子洗澡"); System.out.println("穿衣服"); System.out.println("化妆"); System.out.println("*****************"); System.out.println("周6"+"吃肯德基"); System.out.println("*****************"); System.out.println("卸妆"); System.out.println("洗澡"); System.out.println("睡觉"); System.out.println("第二个女孩子洗澡"); System.out.println("穿衣服"); System.out.println("化妆"); System.out.println("*****************"); System.out.println("周6"+"吃肯德基"); System.out.println("*****************"); System.out.println("卸妆"); System.out.println("洗澡"); System.out.println("睡觉"); System.out.println("第一个女孩子洗澡"); System.out.println("穿衣服"); System.out.println("化妆"); System.out.println("*****************"); System.out.println("周日"+"约会"); System.out.println("*****************"); System.out.println("卸妆"); System.out.println("洗澡"); System.out.println("睡觉"); System.out.println("第二个女孩子洗澡"); System.out.println("穿衣服"); System.out.println("化妆"); System.out.println("*****************"); System.out.println("周日"+"约会"); System.out.println("*****************"); System.out.println("卸妆"); System.out.println("洗澡"); System.out.println("睡觉"); } }
Girl1.java
package aop002; /* * */ public class Girl1 { public void KFC(String datetime){ System.out.println("洗澡"); System.out.println("穿衣服"); System.out.println("化妆"); System.out.println("*****************"); System.out.println("我是第一个女孩"); System.out.println(datetime+"吃肯德基"); System.out.println("*****************"); System.out.println("卸妆"); System.out.println("洗澡"); System.out.println("睡觉"); } public void meet(String datetime){ System.out.println("洗澡"); System.out.println("穿衣服"); System.out.println("化妆"); System.out.println("*****************"); System.out.println("我是第一个女孩"); System.out.println(datetime+"约会"); System.out.println("*****************"); System.out.println("卸妆"); System.out.println("洗澡"); System.out.println("睡觉"); } } </span>
package aop002; /* * */ public class Girl2 { public void KFC(String datetime){ System.out.println("洗澡"); System.out.println("穿衣服"); System.out.println("化妆"); System.out.println("*****************"); System.out.println("我是第二个女孩"); System.out.println(datetime+"吃肯德基"); System.out.println("*****************"); System.out.println("卸妆"); System.out.println("洗澡"); System.out.println("睡觉"); } public void meet(String datetime){ System.out.println("洗澡"); System.out.println("穿衣服"); System.out.println("化妆"); System.out.println("*****************"); System.out.println("我是第二个女孩"); System.out.println(datetime+"约会"); System.out.println("*****************"); System.out.println("卸妆"); System.out.println("洗澡"); System.out.println("睡觉"); } }
package aop002; /* * 面向对象,OOP,抽象成2个女孩的类,以及她的属性 * */ public class Test { public static void main(String[] args) { Girl1 g1 = new Girl1(); Girl2 g2 = new Girl2(); g1.KFC("周六"); g1.meet("周日"); g2.KFC("周六"); g2.meet("周日"); } }
2个女孩的没有变更
Girl.java
<span style="font-size:18px;">package aop003; public interface Girl { public void KFC(String datetime); public void meet(String datetime); }</span>
变化 虽然只是由Girl1 改成Girl ,可是更加清楚!
package aop003; /* * 面向接口 * 本例的缺点: * 1.非业务逻辑的代码,跟核心的业务逻辑代码,耦合一块儿 * 2.一旦非业务逻辑的代码发生改变,所有实现类都要去改 */ public class Test { public static void main(String[] args) { Girl g1 = new Girl1(); Girl g2 = new Girl2(); g1.KFC("周六"); g1.meet("周日"); g2.KFC("周六"); g2.meet("周日"); } }
4、aop004 面向切面,增长了GirlProxy.java 能够理解是代理!经纪人!它负责准备大量的事情,而你只须要写对象。
好比 经纪人,安排了的早餐,汽车出行,会议,拍广告;你只须要带入对象便可。
这里,Girl ,Girl1,Girl2 都没有改变,
GirlProxy.java
package aop004; /* * 一、经纪人和要明星,必须实现同一个接口 * 二、把明星做为一个本类的一个属性,用于调用 */ public class GirlProxy implements Girl { private Girl g; public GirlProxy(String name){ if ("girl1".equals(name)){ g = new Girl1(); }else if ("girl2".equals(name)){ g = new Girl2(); } } @Override public void KFC(String datetime) { g.KFC(datetime); } @Override public void meet(String datetime) { g.meet(datetime); } }
package aop004; /* * 增长一个代理类,相似与明星的经纪人 * 把核心的业务逻辑的代码 和 非核心的 分离 * 把非核心的代码交给经纪人(proxy)去管理, * 注意:经纪人和要明星,必须实现同一个接口 */ public class Test { public static void main(String[] args) { Girl g1 = new GirlProxy("girl1"); Girl g2 = new GirlProxy("girl2"); g1.KFC("周六"); g1.meet("周日"); g2.KFC("周六"); g2.meet("周日"); } }
输出正常:
5、aop005 这个也是面向切面,可是作的事情更少,是4的效率版
Girl 没有变,Girl1,2获得了简化。
Girl1.java
package aop005; /* * */ public class Girl1 implements Girl{ public void KFC(String datetime){ System.out.println("[核心业务逻辑]我是第一个女孩"); System.out.println("[核心业务逻辑]"+datetime+"吃肯德基"); } public void meet(String datetime){ System.out.println("[核心业务逻辑]我是第一个女孩"); System.out.println("[核心业务逻辑]"+datetime+"约会"); } }
Girl2.java :和1差很少。
package aop005; /* * */ public class Girl2 implements Girl { public void KFC(String datetime){ System.out.println("[核心业务逻辑]我是第二个女孩"); System.out.println("[核心业务逻辑]"+datetime+"吃肯德基"); } public void meet(String datetime){ System.out.println("[核心业务逻辑]我是第二个女孩"); System.out.println("[核心业务逻辑]"+datetime+"约会"); } }
GirlProxy.java
package aop005; /* * 一、经纪人和要明星,必须实现同一个接口 * 二、把明星做为一个本类的一个属性,用于调用 */ public class GirlProxy implements Girl { private Girl g; public GirlProxy(String name){ if ("girl1".equals(name)){ g = new Girl1(); }else if ("girl2".equals(name)){ g = new Girl2(); } } @Override public void KFC(String datetime) { System.out.println("洗澡"); System.out.println("化妆"); System.out.println("穿衣服"); System.out.println("*****************"); g.KFC(datetime); System.out.println("*****************"); System.out.println("卸妆"); System.out.println("洗澡"); System.out.println("睡觉"); } @Override public void meet(String datetime) { System.out.println("洗澡"); System.out.println("化妆"); System.out.println("穿衣服"); System.out.println("*****************"); g.meet(datetime); System.out.println("*****************"); System.out.println("卸妆"); System.out.println("洗澡"); System.out.println("睡觉"); } }
package aop005; /* * 增长一个代理类,相似与明星的经纪人 * 把核心的业务逻辑的代码 和 非核心的 分离 * 把非核心的代码交给经纪人(proxy)去管理, * 注意:经纪人和要明星,必须实现同一个接口 */ public class Test { public static void main(String[] args) { Girl g1 = new GirlProxy("girl1"); Girl g2 = new GirlProxy("girl2"); g1.KFC("周六"); g1.meet("周日"); g2.KFC("周六"); g2.meet("周日"); } }
这5个例子,虽然简单,可是 重要的是理解!
看完必定要本身写一个不一样的,才能算领会。
要是上面都看完了,我再修改一下,把Proxy 代理由静态代理,改成动态代理!
六:aop06:动态代理。
Girl,Girl1.java,Girl2.java 3个不变
GirlProxy.java删除了,换为GirlHandler.java
Test也作出了修改。
GirlHandler.java:
package aop006; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class GirlHandler implements InvocationHandler { //调用处理器 private Object targer;// 目标是不固定 public GirlHandler(Object targer) { this.targer = targer; } /* * return 返回是原来目标方法所返回的内容 method 就是要执行的方法 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { before(); // 具体的业务逻辑代码 // Object returnValue = targer.method(args); Object returnValue = method.invoke(targer, args); after(); return returnValue; } private void before() { // 前置任务 System.out.println("[代理执行前置]洗澡"); System.out.println("[代理执行前置]化妆"); System.out.println("[代理执行前置]穿衣服"); System.out.println("*****************"); } private void after() { // 后置任务 System.out.println("*****************"); System.out.println("[代理执行后置]卸妆"); System.out.println("[代理执行后置]洗澡"); System.out.println("[代理执行后置]听歌"); System.out.println(""); } }
package aop006; import java.lang.reflect.Proxy; /* * 增长一个【动态代理类】,相似与明星的经纪人 */ public class Test { public static void main(String[] args) { //第一步:建立目标实现类的实例 Girl g1 = new Girl1(); Girl g2 = new Girl2(); //第二步:建立一个动态代理类(CEO 首席执行官) GirlHandler handler1 = new GirlHandler(g1); GirlHandler handler2 = new GirlHandler(g2); //第三步:建立动态代理(跟静态代理同样,申明的变量仍然是目标的接口) //建立一个宋喆 Girl girlProxy1 = (Girl) Proxy.newProxyInstance( g1.getClass().getClassLoader(), g1.getClass().getInterfaces(), handler1); girlProxy1.KFC("周六"); //对比 g1.KFC("周六"); 运行后的区别 girlProxy1.meet("周日"); Girl girlProxy2 = (Girl) Proxy.newProxyInstance( g2.getClass().getClassLoader(), g2.getClass().getInterfaces(), handler2); girlProxy2.KFC("周六"); //对比 g1.KFC("周六"); 运行后的区别 girlProxy2.meet("周日"); } }注释写的比较仔细了,这里理解可能更难,可是弄懂以后就简单了。