ja写作技巧模式

更新时间:2024-02-24 作者:用户投稿原创标记本站原创 点赞:17248 浏览:80413

摘 要:本文基于JA语言对静态和动态写作技巧做出了分析,并且进行了实现,对以后理解JA的JDK和Cglib包提供的写作技巧怎么写作打下基础.

关 键 词:设计模式;静态写作技巧;动态写作技巧

中图分类号:TP393.02

写作技巧模式是一个非常重要的设计模式,不但我们自己在设计程序的时候经常用到,很多著名的框架如Spring、Hibernate等都用到了写作技巧模式,因此理解并且学会灵活使用写作技巧模式就非常必要.

写作技巧模式的定义:对其他对象提供一种写作技巧以控制对这个对象的访问.简单地说,写作技巧类具有和被写作技巧类一样的方法,调用者通过调用写作技巧类的方法间接调用了被写作技巧类相同名字的方法,对于调用者来说,它不用察觉自己调用的是写作技巧类的方法,感觉上仍然在调用被写作技巧类的方法.对于被写作技巧类来说,写作技巧类可以在调用其方法前后做其他工作,比如写日志等.按照写作技巧的创建时期,写作技巧类可以分为两种:静态写作技巧类:在程序运行前,由程序员创建再编译成.class文件;动态写作技巧类:在程序运行时,运用反射机制动态创建而成.

1静态写作技巧

静态写作技巧类:由程序员创建或由特定工具自动生成源代码,再对其编译.在程序运行前,写作技巧类的.class文件就已经存在了.静态写作技巧原理就是聚合+多态.

1.1静态写作技巧

静态写作技巧模式有三个角色:抽象接口、写作技巧类、被写作技巧类.其它类通过访问写作技巧类来访问被写作技巧类.

1.2静态写作技巧的实现

(1)建一个抽象接口

publicinterfaceSubject{

publicvoidprint(Stringwords);

}

(2)建一个被写作技巧类,需要实现抽象接口

publicclassRealSubjectimplementsSubject{

publicvoidprint(Stringwords){

System.out.println("被写作技巧人郭襄说:"+words);

}

}

(3)建一个写作技巧类,需要实现抽象接口

publicclassProxySubjectimplementsSubject{

privateSubjects;

publicProxySubject(Subjects){

this.s等于s;

}

publicvoidprint(Stringwords){

System.out.println("我是写作技巧,我名字叫黄蓉!");

s.print(words);

System.out.println("黄蓉写作技巧完毕!");

}

}

(4)建一个客户端程序测试,关键代码如下:

Subjectsub1等于newRealSubject();

Subjectsub2等于newProxySubject(sub1);

sub2.print("你好!");

运行输出:我是写作技巧,我的名字叫黄蓉!;被写作技巧的人郭襄说:你好!;黄蓉写作技巧完毕.从输出可以看出,在真实对象的print方法被调用前后,写作技巧对象都做了其他操作.对于客户端来说,它只对接口Subject编程,提高了代码的可维护和可升级性.

2动态写作技巧

动态写作技巧类:就是其写作技巧类是在程序运行时,运用反射机制动态创建而成,并不需要像静态写作技巧那样子事先要编写好写作技巧类.如果有多重写作技巧,就要写多个写作技巧类,还有如果一个类有多个方法都需要写作技巧的话,就更加使得代码很臃肿,不易维护,这个时候就需要动态地来生成写作技巧类,这就是动态写作技巧.

2.1动态写作技巧

动态写作技巧模式至少要有6个角色:(1)抽象接口;(2)被写作技巧类;(3)处理器接口;(4)自定义的处理器(实现处理器接口);(5)生成成写作技巧类的类;(6)写作技巧类(由第5点的类通过反射技术自动生成).

2.2动态写作技巧的实现

(1)首先建一个抽象接口

publicinterfaceSubject{

publicvoidprint();

}

(2)建一个被写作技巧类,需要实现Subject接口

publicclassRealSubjectimplementsSubject{

publicvoidprint(){

System.out.println("被写作技巧人郭襄");

}

}

(3)建一个处理接口

publicinterfaceInvocationHandler{

publicObjectinvoke(Objectproxy,Methodmethod)throwsException;

}

(4)建一个用户自定义的处理器,需要实现处理接口

在invoke()方法里写上被写作技巧类的方法调用前后要进行的动作.这个invoke()方法我们不用直接调用,是让将来自动生成的写作技巧类去调用的.invoke()方法关键代码如下:

System.out.println("我是写作技巧人郭靖,开始写作技巧");

method.invoke(delegate);

System.out.println("我是写作技巧人郭靖,写作技巧完毕");(5)建生成写作技巧类的类,主要是运用ja的反射技术和jdk的编译工具生成写作技巧类对象并加载到内存里面,代码比较复杂,这里不再详细描述.

(6)编写测试客户端,关键代码如下

Subjectsub1等于newRealSubject();

LogHandlerhander等于newLogHandler();

Subjectsub2等于(Subject)hander.bind(sub1);


sub2.print();

输出结果:我是写作技巧人郭靖;开始写作技巧;被写作技巧的人郭襄;我是写作技巧人郭靖,写作技巧完毕.从结果可以看出,写作技巧成功,并且自动生成了写作技巧类$Proxy.ja文件,并成功实现了写作技巧的效果.

2.3动态写作技巧的优势

动态写作技巧的明显好处上面就体现出来了:对于同一个对象的所有方法,如果对所有方法都是相同的处理逻辑,只需要写一次处理逻辑就行;对于同一个抽象接口,不同的对象,如果对所有对象的相同名字的方法具有相同的处理逻辑(同一个对象,不同方法的处理逻辑可以不同),也只需要写一次处理逻辑就行,只需要写一次处理器类即可;如果某一天,那个方法的处理逻辑被改变了,只需要改动一次即可,如果是静态写作技巧,每个写作技巧类下的相对应的方法的处理逻辑都要改动一次,维护非常困难.

3结束语

写作技巧模式可以运用在如下这些方面:(1)用于在程序调用前后记录相关日志及其他附加操作;(2)用于某些操作前的安全及权限的验证等保护操作;(3)用于创建对象,也叫虚写作技巧,对于某些大对象,在真正需要它的时候,运用写作技巧模式去创建;(4)使得同一对象被多个客户同时访问不产生冲突.

我们可以灵活使用写作技巧模式,配合其他模式的使用,如工厂模式,使我们的程序更加高内聚、低耦合,而且非常优雅.