{
LoggerAgent.error(\ \ e.printStackTrace() ;
}finally {
manager.close(stmt);
manager.releaseConnection(conn); } } }
这样,一个模板类就完成了。我们也通过这个模板类将catch?finally?两段代码提出来了。我们来看看使用了这个模板类的数据层方法是怎么实现的: new DataTemplate().execute(new DataManager() {
public void manageData() {
String[] divisionData = null;
conn = manager.getInstance().getConnection(); stmt =
(OracleCallableStatement)conn.prepareCall(\PM_GET_PRODUCT.HEADER_DIVISION(?, ?) }\
stmt.setLong(1 ,productId.longValue() ); stmt.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR); ; stmt.execute();
ResultSet rs = stmt.getCursor(2); int i = 0 ;
String strDivision = \ while( rs.next() ) {
strDivision += rs.getString(\+ \}
int length = strDivision.length() ; if(length != 0 ) {
strDivision = strDivision.substring(0,length - 1);
}
divisionData = StringUtil.split(strDivision, \ map.put(\
LoggerAgent.debug(\
6
ta\} });
注意:本段代码仅供思路上的参考,没有经过上机测试。 我们可以看到,正是这个实现了DataManager接口得匿名内部类的使用,才使得我们解决了对try?catch?finally?语句的改造。这样,第一为我们解决了令人痛苦的重复代码;第二也让我们在数据层方法的编码中,直接关注对数据的操作,不用关心那些必需的但是与数据操作无关的东西。
我们现在来回想一下Spring框架的数据层,是不是正是使用了这种方法呢?
场景之三:一些多算法场合
假如我们有这样一个需求:我们的一个方法用来对数组排序并且依次打印各元素,对数组排序方法有很多种,用哪种方法排序交给用户自己确定。
对于这样一个需求,我们很容易解决。我们决定给哪些排序算法定义一个接口,具体的算法实现由用户自己完成,只要求他实现我们的接口就行。 public interface SortAlgor {
public void sort(int[] is); }
这样,我们再在方法里实现先排序后打印,代码如下: public void printSortedArray(int[] is,SortAlgor sa) {
??
sa.sort(is);
for(int i=0;i System.out.print(is[i]+” “); } System.out.println(); } 客户端对上面方法的使用如下: int[] is = new int[]{3,1,4,9,2}; printSortedArray(is,new SortAlgor() { public void sort(is) { int k = 0; for(int i=0;i for(int j=i+1;j if(is[i]>is[j]) { 7 k = is[i]; is[i] = is[j]; is[j] = k; } } } } }); 这样的用法很多,我们都或多或少的被动的使用过。如在Swing编程中,我们经常需要对组件增加监听器对象,如下所示: spinner2.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { System.out.println(\} } ); 在Arrays包里,对元素为对象的数组的排序: Arrays.sort(emps,new Comparator(){ Public int compare(Object o1,Object o2) { return ((Employee)o1).getServedYears()-((Employee)o2).getServedYears(); } }); 这样的例子还有很多,JDK教会了我们很多使用内部类的方法。随时我们都可以看一看API,看看还会在什么地方使用到内部类呢? 场景之四:适当使用内部类,使得代码更加灵活和富有扩展性 适当的使用内部类,可以使得你的代码更加灵活和富有扩展性。当然,在这里头起作用的还是一些模式的运行,但如果不配以内部类的使用,这些方法的使用效果就差远了。不信?请看下面的例子: 我们记得简单工厂模式的作用就是将客户对各个对象的依赖转移到了工厂类里。很显然,简单工厂模式并没有消除那些依赖,只是简单的将它们转移到了工厂类里。如果有新的对象增加进来,则我们需要修改工厂类。所以我们需要对工厂类做进一步的改造,进一步消除它对具体类的依赖。以前我们提供过一个使用反射来消除依赖的方法;这里,我们将提供另外一种方法。 这种方法是将工厂进一步抽象,而将具体的工厂类交由具体类的创建者来实现,这样,工厂类和具体类的依赖的问题就得到了解决。而工厂的使用者则调用抽象的工厂来获得具体类的对象。如下。 Java代码 8 1. 我们以一个生产形体的工厂为例,下面是这些形体的接口: 2. package polyFactory; 3. 4. public interface Shape { 5. public void draw(); 6. public void erase(); 7. 8. } 9. 10.通过上面的描述,大家都可能已经猜到,这个抽象的工厂肯定使用的是模板方法模式。如下: 11.package polyFactory; 12. 13.import java.util.HashMap; 14.import java.util.Map; 15. 16. 17.public abstract class ShapeFactory { 18.protected abstract Shape create(); 19.private static Map factories = new HashMap(); 20.public static void addFactory(String id,ShapeFactory f) 21.{ 22. factories.put(id,f); 23.} 24.public static final Shape createShape(String id) 25.{ 26. if(!factories.containsKey(id)) 27. { 28. try 29. { 30. Class.forName(\31. } 32. catch(ClassNotFoundException e) 33. { 34. throw new RuntimeException(\ation : \35. } 36. } 37. return ((ShapeFactory)factories.get(id)).create(); 38.} 39.} 不错,正是模板方法模式的运用。这个类蛮简单的:首先是一个create()方法, 9 用来产生具体类的对象,留交各具体工厂实现去实现。然后是一个Map类型的静态变量,用来存放具体工厂的实现以及他们的ID号。接着的一个方法使用来增加一个具体工厂的实现。最后一个静态方法是用来获取具体对象,里面的那个Class.forName??的作用是调用以ID号为类名的类的一些静态的东西。 下面,我们来看具体的类的实现: Java代码 1. package polyFactory; 2. 3. public class Circle implements Shape { 4. 5. 6. public void draw() { 7. // TODO Auto-generated method stub 8. System.out.println(\9. } 10. 11. 12.public void erase() { 13. // TODO Auto-generated method stub 14. System.out.println(\15.} 16.private static class Factory extends ShapeFactory 17.{ 18. protected Shape create() 19. { 20. return new Circle(); 21. } 22.} 23.static {ShapeFactory.addFactory(\24. 25.} 这个类的其他的地方也平常得很。但就是后面的那个内部类Factory用得好。第一呢,这个类只做一件事,就是产生一个Circle对象,与其他类无关,就这一个条也就满足了使用内部类的条件。第二呢,这个Factory类需要是静态的,这也得要求它被使用内部类,不然,下面的ShapeFacotry.addFactory就没办法add了。而最后的那个静态的语句块是用来将具体的工厂类添加到抽象的工厂里面去。在抽象工厂里调用Class.forName就会执行这个静态的语句块了。 下面仍然是一个具体类: Java代码 1. package polyFactory; 2. 10 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库java内部类的四个应用场景(2)在线全文阅读。
相关推荐: