管道过滤器的实现---java语言

因为该模式有以下部分组成所以

过滤器 Filter
数据源 Source
数据池 Sink
管道 Pipe

 

所以首先来写filter,但是在写filter之前必须有pipe也就是管道,所以先来定义管道

pipe类

package ch03.pipesfilteres;

import java.util.ArrayDeque;

public class Pipe {
 private ArrayDeque<Packet> packets = new ArrayDeque<Packet>();
 

 public void write(Packet packet) {
  packets.addFirst(packet);
  //System.out.println(""+packet+" is written into pipe.");
  
 }

 public int size() {
  return packets.size();
 }

 public Packet read() throws EmptyPipeException {
  if (size() == 0) {
   throw new EmptyPipeException();
  }
  Packet p = packets.getLast();
  packets.pollLast();
  return p;
 }
}

 

 

写完pipe之后,就可以写filter类了

首先是一个抽象类

package ch03.pipesfilteres;

public abstract class Filter {
 protected Pipe input;
 protected Pipe output;
 
 public Filter(Pipe in, Pipe out) {
  input=in;
  output=out;
 }
 
 public abstract void process();
}
他的实现:

 

package ch03.pipesfilteres;

public class FilterImpl extends Filter {
 public FilterImpl(Pipe in,Pipe out) {
  super(in,out);
 }
 public void customNotify() {
  process();
 }

 @Override
 public void process() {
  while (input.size() > 0) {
   try {
    Packet packet=input.read();//
    //packet.setContent("");
    output.write(packet);
    System.out.println("已经将"+packet+"写入到了pipe2");
    
   }  catch (EmptyPipeException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }

}

 

写完这个之后就要把pipe放入数据source中,那么source是如何实现的呢?可想而知,其接受pipe

 

package ch03.pipesfilteres;

public class DataSource extends Filter{
  
 public DataSource(Pipe out) {
  super(null,out);  
 }

 @Override
 public void process() {
  for(int i=1;i<5;i++) {
   System.out.println("DataSource: packet("+i+") is created.");
   Packet p=new Packet(i);
   p.setContent("第"+i+"已经写入pipe");
   System.out.println("第"+i+"已经写入pipe");
   output.write(p);
   
   
  }
  
 }
}

filter写完之后就要开始完成sink的编写了,也就是要将经过filer处理过的pipe输入到终点

package ch03.pipesfilteres;

import java.util.ArrayDeque;

public class DataSink extends Filter{
 private FilterImpl observer;
 
 protected ArrayDeque<Packet> received = new ArrayDeque<Packet>();
 
 public DataSink(Pipe in) {
  super(in,null);
  observer = null;
 }
 public int size() {
  return received.size();
 }
 
 public Packet nextPacket() {
  Packet p = received.getLast();
  received.pollLast();
  return p;
 }
 public void customNotify() {
  try {
   while(input.size() > 0) {
    received.addFirst(input.read());
   }
  } catch (EmptyPipeException e) {
   System.err.println(" empty pipe. ");
  }
  if(observer != null)
   observer.customNotify();
 }

 public void setObserver(FilterImpl observer) {
  this.observer = observer;
 }
 public FilterImpl getObserver() {
  return observer;
 }
 @Override
 public void process() {
  try {
   int i=0;
   for(i=0;i<4;i++){
    System.out.println(input.read()+"已经进入了数据池");
    }
   
  } catch (EmptyPipeException e) {
   e.printStackTrace();
  }
  
 }
}
这些写完之后就是其他一些类的编写了

package ch03.pipesfilteres;

public class Packet {
 //标号
 private int pno = -1;
 //标号对应的内容
 private String content;
 public Packet() {
 }

 public Packet(int no) {
  pno = no;
 }
 public  void setContent(String c) {
  content=c;
 }
 public String toString() {
  return "Packet(" + pno + "):"+content;
 }
}

package ch03.pipesfilteres;

public class EmptyPipeException extends Exception {

}

package ch03.pipesfilteres;

public class NoOutputPipeException extends Exception {
 
}

最后就可以编写一个测试类来测试了

package ch03.pipesfilteres;

public class TestPipes {

 public static void main(String[] args) {
 
  /** Instantiate our pattern blueprint classes. */
  
  Pipe pipe1 = new Pipe();
 
  Pipe pipe2= new Pipe();
  DataSource source = new DataSource(pipe1);
  source.process();
  FilterImpl filter=new FilterImpl(pipe1,pipe2);
  filter.process();
  DataSink sink = new DataSink(pipe2);
  sink.process();
  
  
 
 }

}

 

得到以下的运行结果

DataSource: packet(1) is created.
第1已经写入pipe
DataSource: packet(2) is created.
第2已经写入pipe
DataSource: packet(3) is created.
第3已经写入pipe
DataSource: packet(4) is created.
第4已经写入pipe
已经将Packet(1):第1已经写入pipe写入到了pipe2
已经将Packet(2):第2已经写入pipe写入到了pipe2
已经将Packet(3):第3已经写入pipe写入到了pipe2
已经将Packet(4):第4已经写入pipe写入到了pipe2
Packet(1):第1已经写入pipe已经进入了数据池
Packet(2):第2已经写入pipe已经进入了数据池
Packet(3):第3已经写入pipe已经进入了数据池
Packet(4):第4已经写入pipe已经进入了数据池

目录结构如下:

 

 


代码在我的资源中,如果需要请下载

 

 

 

### 回答1: 需要使用Java的I/O流实现一个管道,然后通过添加四个不同的过滤器来对管道的输入和输出进行处理。示例代码如下: 1.创建InputStream对象: ```java FileInputStream fileInputStream = new FileInputStream(file); ``` 2.创建四个不同的过滤器: ```java BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream); DataInputStream dataInputStream = new DataInputStream(bufferedInputStream); LineNumberInputStream lineNumberInputStream = new LineNumberInputStream(dataInputStream); PushbackInputStream pushbackInputStream = new PushbackInputStream(lineNumberInputStream); ``` 3.将过滤器添加到管道中: ```java PipedOutputStream pipedOutputStream = new PipedOutputStream(); PipedInputStream pipedInputStream = new PipedInputStream(pipedOutputStream); pipedOutputStream.connect(pushbackInputStream); ``` 4.通过管道向输出流写入数据: ```java pipedOutputStream.write("Hello World!".getBytes()); ``` 5.通过管道从输入流读取数据: ```java int data = pipedInputStream.read(); ``` 通过这样的方式,我们可以利用Java的I/O流和过滤器实现一个有四个过滤器管道。 ### 回答2: 在Java语言中,可以通过使用Servlet API来实现一个具有四个过滤器管道。 首先,我们需要创建四个过滤器类,分别为Filter1、Filter2、Filter3和Filter4。这四个过滤器类需要实现javax.servlet.Filter接口,并重写其doFilter方法。 在doFilter方法中,我们可以编写具体的过滤逻辑。例如,Filter1可以对请求进行某种预处理操作,Filter2可以进行身份验证,Filter3可以对请求进行数据验证,Filter4可以对响应进行加密操作。 接下来,我们需要在web.xml文件中配置这四个过滤器。在web.xml文件中,可以使用<filter>和<filter-mapping>标签来配置过滤器类和过滤器应用的URL模式。 示例配置如下: ```xml <filter> <filter-name>Filter1</filter-name> <filter-class>com.example.Filter1</filter-class> </filter> <filter> <filter-name>Filter2</filter-name> <filter-class>com.example.Filter2</filter-class> </filter> <filter> <filter-name>Filter3</filter-name> <filter-class>com.example.Filter3</filter-class> </filter> <filter> <filter-name>Filter4</filter-name> <filter-class>com.example.Filter4</filter-class> </filter> <filter-mapping> <filter-name>Filter1</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>Filter2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>Filter3</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>Filter4</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 在上述配置中,我们将这四个过滤器应用于所有的URL模式。 这样,当有请求发送到服务器时,请求会先经过Filter1,然后是Filter2,接着是Filter3,最后是Filter4。每个过滤器都可以根据自身的逻辑对请求进行处理,并将请求传递给下一个过滤器。 通过这样的配置,我们就实现了一个具有四个过滤器管道。 ### 回答3: 使用Java语言实现一个有四个过滤器管道可以通过以下步骤进行: 首先,创建一个接口Filter,该接口包含一个方法filter(String input)用于处理输入数据并返回处理结果。 接下来,创建四个类分别实现Filter接口,并实现filter方法来完成不同的过滤操作。例如,可以创建UpperCaseFilter类来将输入字符串转换为大写形式;创建LowerCaseFilter类来将输入字符串转换为小写形式;创建RemoveSpacesFilter类来移除输入字符串中的空格;创建ReplaceFilter类来替换指定字符。 然后,创建一个Pipeline类来定义一个包含四个过滤器管道。该类包含一个List<Filter>对象用于存储过滤器,并提供一个addFilter(Filter filter)方法用于将过滤器添加到管道中。 在Pipeline类中实现一个方法process(String input)用于处理输入数据。该方法依次调用每个过滤器对象的filter方法,并将处理结果传递给下一个过滤器,最后返回处理结果。 最后,可以编写一个简单的测试程序来验证管道的功能。在测试程序中创建一个Pipeline对象,添加四个过滤器管道中,然后调用process方法传入输入数据,最后输出处理结果。 通过以上步骤,就可以使用Java语言实现一个有四个过滤器管道。每个过滤器管道中依次处理输入数据,完成特定的过滤操作,并将处理结果传递给下一个过滤器,最终得到最终的处理结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值