[TOC]
过程:搅拌水泥,拉砖头,请工人,粉刷墙壁等等,一系列非常 琐碎的事情,
对象:砌墙!
接口:这里,建立一个厕所,这里建立一个客厅!
切面:就这么理解吧,假如你和女友约会,
周五:女友出门之前需要 洗澡,洗头,化妆,(吃饭),卸妆,洗澡,睡觉
周六:女友出门之前需要 洗澡,洗头,化妆,(喝饮料),卸妆,洗澡,睡觉
周日:女友出门之前需要 洗澡,洗头,化妆,(去游乐园),卸妆,洗澡,睡觉
你能接触的,就是很女友 吃喝玩乐,
一:面向过程
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("睡觉");
}
}
二:面向对象
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("睡觉");
}
}
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("睡觉");
}
}
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个女孩的没有变动
public interface Girl {
public void KFC(String datetime);
public void meet(String datetime);
}
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("周日");
}
}
四:面向切面
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);
}
}
/*
* 增加一个代理类,类似与明星的经纪人
* 把核心的业务逻辑的代码 和 非核心的 分离
* 把非核心的代码交给经纪人(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("周日");
}
}
五:面向漆面
Girl 接口没有变
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+"约会");
}
}
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+"约会");
}
}
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("睡觉");
}
}
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("周日");
}
}
六:动态代理
Girl,Girl1.java,Girl2.java 3个不变
GirlProxy.java删除了,换为GirlHandler.java
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("");
}
}
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("周日");
}
}
网友评论