发表于: 2018-03-01 21:08:03
1 660
今日完成
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 数据类型的使用。
评论