发表于: 2018-03-01 21:08:03

1 662


今日完成

1.学习了JDK的动态代理

Proxy类的代码量被固定下来,不会因为业务的逐渐庞大而庞大;

可以实现AOP编程,实际上静态代理也可以实现,总的来说,AOP可以算作是代理模式的一个典型应用;

解耦,通过参数就可以判断真实类,不需要事先实例化,更加灵活多变。

//需要被代理的接口
public interface School {
void goToSchool();
   void afterSchool();
   
}
public class SchoolImpl implements School {
@Override
   public void goToSchool() {
System.out.println("上学........");
       
   }

@Override
   public void afterSchool() {
System.out.println("放学......");
   }
}

如果有一天想在每次上学和放学前打印日志,或者检验权限,就需要在每个实现类里面加上打印日志的代码,就是这样。

public class SchoolImpl implements School {
private static final Logger logger = Logger.getLogger(SchoolImpl.class);
   @Override
   public void goToSchool() {
logger.info("log start 上学");
       System.out.println("上学........");
       
   }

@Override
   public void afterSchool() {
logger.info("log start 放学");
       System.out.println("放学......");
   }
}

但是随着学校的发展,日志不能这么打了,要改成“好好学习,天天向上”;然后就要该代码,这里只是有一个学校,如果有几百个学校都实现了school接口,改起来根本就不现实。这里就有了动态代理这个东西。

首先

public class MyInvocationHandler implements InvocationHandler {
private Object target;
   
   MyInvocationHandler(Object target) {
this.target = target;
   }

@Override
   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("log start");
       Object object = method.invoke(target, args);
       System.out.println("log end");
       return object;
   }
}

我们把接口的调用通过反射交给其他人来完成。在调用的过程中进行操作。

    private static void proxyDemoTest_1() {
School school = new SchoolImpl();
           
       MyInvocationHandler myInvocationHandler = new MyInvocationHandler(school);
   
       School schoolProxy = (School) Proxy.newProxyInstance(school.getClass().getClassLoader(), school.getClass().getInterfaces(), myInvocationHandler);
   
       schoolProxy.afterSchool();
       schoolProxy.goToSchool();
   }
}

如果还有其他的实现类,也需要打印日志,就不需要在额外的添加打印日志的代码了。

public class SchoolImpl2 implements School{
@Override
   public void goToSchool() {
System.out.println("学校2 上学了。。");
   }

@Override
   public void afterSchool() {
System.out.println("学校2 放学了 。。 ");
   }
}

那么在调用学校2的方法时,使用代理来生成就可以打印日志了。

private static void proxyDemoTest_3() {
School schoolImpl2 = new SchoolImpl2();
   MyInvocationHandler myInvocationHandler = new MyInvocationHandler(schoolImpl2);
   
  School proxySchoolImpl2 = (School) Proxy.newProxyInstance(schoolImpl2.getClass().getClassLoader(),schoolImpl2.getClass().getInterfaces(),myInvocationHandler);
   proxySchoolImpl2.goToSchool();
   proxySchoolImpl2.afterSchool();
}

2.设计模式---模版设计模式。通过将模版填充的部分向上抽取成抽象方法。

/**
* 模版设计模式
*/
public abstract class GetTimeTempl {

public abstract void code();
   
   void getTime() {
long startTime = System.currentTimeMillis();
       code();
       long endtime = System.currentTimeMillis();
       System.out.println(endtime - startTime + ":" + "毫秒");
   }
}
public class PatternDemo extends GetTimeTempl {


@Override
   public void code() {
long j = 0;
       for(long i = 0; i < 1000000000; i++) {
j = j+i;
       }
System.out.println(j);
   }

public static void main(String[] args) {
PatternDemo patternDemo = new PatternDemo();
       patternDemo.getTime();
   }
}

3.设计DB字段。

明日计划

1.继续设计数据库和梳理逻辑

遇到问题

1.bigdecimal 数据类型的使用。



返回列表 返回列表
评论

    分享到