Используется в основном для создания разнообразных
фильтров. Данные проходя через цепочку фильтров(обработчиков)
подвергаются различной модификации. Один из примеров
обработка 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());
}
}
}
Комментариев нет:
Отправить комментарий