четверг, 24 февраля 2011 г.

Шаблон Цепочка ответственности

Также довольно простой в понимании шаблон.
Используется в основном для создания разнообразных
фильтров. Данные проходя через цепочку фильтров(обработчиков)
подвергаются различной модификации. Один из примеров
обработка URL, другой - обработка запросов в сервлетах.
// file: app.java
// build: javac app.java
// run: java app
 //задаем интерфейс обработчика, 
 //с возможностью задать следующего(setParent)
 interface Handler
 {
    public void setParent(Handler parent);
    public void handle(String url) throws Exception;
 }
 class FtpHandler implements Handler
 {
  private Handler parent=null;  
  @Override 
  public void setParent(Handler parent)
  {
      this.parent=parent;
  
  }
  @Override 
  public void handle(String url) throws Exception
  {
      //если объект подходящий - обрабатываем
      if(url.startsWith("ftp://"))
       System.out.println("FtpHandler resource handle success!");
      else//нет - передаем по цепочке другому обработчику
      if(parent!=null) parent.handle(url);//если цепочка прервалась
      else throw new Exception("Handler not found!");//сообщаем об этом 
      //и завершаем обработку
  }
 }
 class HttpHandler implements Handler
 {
  private Handler parent=null;  
  @Override 
  public void setParent(Handler parent)
  {
      this.parent=parent;
      
  }
  @Override 
  public void handle(String url) throws Exception
  {
      if(url.startsWith("http://"))
       System.out.println("HttpHandler resource handle success!");
      else
      if(parent!=null) parent.handle(url);
      else throw new Exception("Handler not found!");
  }
 }
 class ChainBuilder
 {
    public ChainBuilder(){}
    private Handler root=null;
    public Handler getRoot(){return root;}
    public Handler add(Handler handler)
    {
  if(root==null) root=handler;
  else           root.setParent(handler);
   return handler;
 }
 }
public class app
{
 public static void main(String[] args)
 {
    //суть паттерна цепочка ответственности
    //что мы заранее не знаем какой точно объект
    //будет подан на вход, следовательно не знаем какой
    //обработчик нам понадобиться. пример: адресная строка броузера
    ChainBuilder cb =new ChainBuilder();
    cb.add(new FtpHandler());
    cb.add(new HttpHandler());
    Handler handler=cb.getRoot();
     handle(handler,"https://narod.ru");
     handle(handler,"ftp://narod.ru");
     handle(handler,"http://narod.ru");
 }  
 public static void handle(Handler handler,String url)
 {
  try
  {
      handler.handle(url);
  }
  catch(Exception e)
  {
   //e.printStackTrace();
   System.out.println(e.getMessage());
  }
 }
}

Комментариев нет:

Отправить комментарий