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

本文章适合初学者,主要是整理清楚,java , 从面向过程 到 面向对象,面向接口,面向切面。

假如我们正在建立一栋别墅。

过程:搅拌水泥,拉砖头,请工人,粉刷墙壁等等,一系列非常 琐碎的事情,

对象:砌墙!

接口:这里,建立一个厕所,这里建立一个客厅!

切面:就这么理解吧,假如你和女友约会,

周五:女友出门之前需要 洗澡,洗头,化妆,(吃饭),卸妆,洗澡,睡觉

周六:女友出门之前需要 洗澡,洗头,化妆,(喝饮料),卸妆,洗澡,睡觉

周日:女友出门之前需要 洗澡,洗头,化妆,(去游乐园),卸妆,洗澡,睡觉

你能接触的,就是很女友 吃喝玩乐,

【java初学者】理解,从面向过程 到 面向对象,面向接口,面向切面_第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("睡觉");

	}

}


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

}

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

}


三、aop003  增加了Girl ,面向接口




2个女孩的没有变动

Girl.java

package aop003;

public interface Girl {
	public void KFC(String datetime);
	public void meet(String datetime);
}

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

}



四、aop004 面向切面,增加了GirlProxy.java  可以理解是代理!经纪人!它负责准备大量的事情,而你只需要写对象。

比如 经纪人,安排了的早餐,汽车出行,会议,拍广告;你只需要带入对象即可。

【java初学者】理解,从面向过程 到 面向对象,面向接口,面向切面_第2张图片

这里,Girl ,Girl1,Girl2 都没有改变,

GirlProxy.java

package aop004;

/*
 * 1、经纪人和要明星,必须实现同一个接口
 * 2、把明星作为一个本类的一个属性,用于调用
 */
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("周日");
	}

}
 


输出正常:

【java初学者】理解,从面向过程 到 面向对象,面向接口,面向切面_第3张图片


五、aop005 这个也是面向切面,但是做的事情更少,是4的效率版

【java初学者】理解,从面向过程 到 面向对象,面向接口,面向切面_第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;

/*
 * 1、经纪人和要明星,必须实现同一个接口
 * 2、把明星作为一个本类的一个属性,用于调用
 */
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("周日");
	}

}


代码正常运行:

【java初学者】理解,从面向过程 到 面向对象,面向接口,面向切面_第5张图片



这5个例子,虽然简单,但是 重要的是理解!

看完一定要自己写一个不同的,才能算领会。

要是上面都看完了,我再修改一下,把Proxy 代理由静态代理,改为动态代理!

六:aop06:动态代理。

【java初学者】理解,从面向过程 到 面向对象,面向接口,面向切面_第6张图片

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

	}

}

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




你可能感兴趣的:(java)