【java初学者】理解,从面向过程 到 面向对象,面向接口,面向切面

本文章适合初学者,主要是整理清楚,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("睡觉");

	}

}

2、aop002  增长了 2个类 Girl1.java,面向对象!


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>

Girl2.java :和1同样的事情,只是一个约会,一个去肯德基

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("睡觉");
	}

}

Test.java

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("周日");
	}

}

3、aop003  增长了Girl ,面向接口




2个女孩的没有变更

Girl.java

<span style="font-size:18px;">package aop003;

public interface Girl {
	public void KFC(String datetime);
	public void meet(String datetime);
}</span>

Test.java 已经发生了改变!new 对象由 Girl1 g1=new Girl1()  ; 表位Girl g1=new Girl1(); 

变化 虽然只是由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);
	}

}

Test.java

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("睡觉");
	}

}

Test.java

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("");
	}
	

}

Test.java

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("周日");
		

	}

}
注释写的比较仔细了,这里理解可能更难,可是弄懂以后就简单了。