上下文重用(2)

现在我们从readAllUsers()和readUsersOfStatus()调用readUserList(...)方法,并给定不同的操作参数:

public List readAllUsers(){ return readUserList("select * from users", new String[]{}); } public List readUsersWithStatus(String status){ return readUserList("select * from users", new String[]{status}); }

我相信你可以找出其他更好的办法来实现重用功能,并将他们参数化使得更加好用。

上下文重用

上下文重用与功能重用略有不同。上下文重用是一系列指令的重用,各种不同的操作总是在这些指令之间进行。换句话说,重复使用各种不同行为之前和之后的语句。因此上下文重用通常会导致控制风格类的反转。上下文重用是重用异常处理,连接和事务生命周期管理,流迭代和关闭以及许多其他常见操作上下文的非常有效的方法。

这里有两个方法都是用 InputStream 做的:

public void printStream(InputStream inputStream) throws IOException { if(inputStream == null) return; IOException exception = null; try{ int character = inputStream.read(); while(character != -1){ System.out.print((char) character); // 不同 character = inputStream.read(); } } finally { try{ inputStream.close(); } catch (IOException e){ if(exception == null) throw e; } } } public String readStream(InputStream inputStream) throws IOException { StringBuffer buffer = new StringBuffer(); // 不同 if(inputStream == null) return; IOException exception = null; try{ int character = inputStream.read(); while(character != -1){ buffer.append((char) character); // 不同 character = inputStream.read(); } return buffer.toString(); // 不同 } finally { try{ inputStream.close(); } catch (IOException e){ if(exception == null) throw e; } } }

两种方法与流的操作是不同的。但围绕这些操作的上下文是相同的。上下文代码迭代并关闭 InputStream。上述代码中除了使用注释标记的不同之处外都是其上下文代码。

如上所示,上下文涉及到异常处理,并保证在迭代后正确关闭流。一次又一次的编写这样的错误处理和资源释放代码是很繁琐且容易出错的。错误处理和正确的连接处理在 JDBC 事务中更加复杂。编写一次代码并在任何地方重复使用显然会比较容易。

幸运的是,封装上下文的方法很简单。 创建一个上下文类,并将公共上下文放入其中。 在上下文的使用中,将不同的操作指令抽象到操作接口之中,然后将每个操作封装在实现该操作接口的类中(这里称之为操作类),只需要将该操作类的实例插入到上下文中即可。可以通过将操作类的实例作为参数传递给上下文对象的构造函数,或者通过将操作类的实例作为参数传递给上下文的具体执行方法来完成。

下面展示了如何将上述示例分隔为上下文和操作接口。StreamProcessor(操作接口)作为参数传递给StreamProcessorContext的processStream()方法。

// 流处理插件接口 public interface StreamProcessor { public void process(int input); } // 流处理上下文类 public class StreamProcessorContext{ // 将 StreamProcessor 操作接口实例化并作为参数 public void processStream(InputStream inputStream, StreamProcessor processor) throws IOException { if(inputStream == null) return; IOException exception = null; try{ int character = inputStream.read(); while(character != -1){ processor.process(character); character = inputStream.read(); } } finally { try{ inputStream.close(); } catch (IOException e){ if(exception == null) throw e; throw exception; } } } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/05f7ef8a3be87694e4ee839bb6e9e194.html