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