0

Я разбор строки типа:Design Pattern для выполнения запросов на различные «выходных уровнях»

\read(customer) hello world 


~> \method(arg, arg, ...) 

в структурукомпозита данных, который сохраняется в к п аргументов, которые объекты requestLeaf, аргументы которых могут быть объектом requestLeaf (если это просто текст, который должен быть возвращен, как указано выше («hello world»)) или другой requestComposite object (если выполняется некоторое вычисление (например, read-> client), пока он снова не станет простым.

requestComposite Object 
(
    [requests:protected] => Array 
     (
      [0] => commandRequest Object 
       (
        [methodName:protected] => read 
        [arguments:protected] => Array 
         (
         [0] => commandRequest Object 
          (
          [methodName:protected] => text 
          [arguments:protected] => customer 
         ) 
        ) 
      ) 
      [1] => commandRequest Object 
       (
        [methodName:protected] => text 
        [arguments:protected] => hello world 
      ) 
    ) 
) 

То, что я хочу достичь, состоит в том, чтобы прокрутить весь композит так, чтобы он выдавал какой-то документ.

аргументы или Лифс из самого первого композитный представляют в корень или уровень 0 для печати на документе.
Я хочу использовать библиотеку для этого. Эта библиотека может обрабатывать текст, изображения и т. Д., Но ничего не может оценить!

Все > Уровень 0 должен быть вычислен в другой библиотека.
Эта библиотека может считывать значения членов, выполнять некоторую математику и т. Д. И возвращать свое окончательное значение (исключительно строки) в корень для распечатки.
Все остальное напечатано явным путем, например. \ IMG() или \ текст()

Там может быть

\read(x) 

маркер для поиска на значение члена X,
whichs значение должно быть напечатано неявное, (без упаковки его в другой \ текст (!))

может быть \ список() маркер цикла его аргументы с помощью указанного списка членов, как:

\list(\read(x))) 

X может быть другой Y

\list(\read(\read(y))). 

Другими словами: Я не может знать, насколько глубока структура.

Случается, что я довольно новичок в разработке шаблонов и, в частности, ОО.
Я возиться с цепи ответственности шаблоном для «выполнения» прямо сейчас, где рендеринга/вывод библиотеки и библиотека вычисления строят цепочку обработчиков.
Но мне немного интересно, если CoR действительно заполняет мои потребности:

Как бы вы решили проблему вроде этого?

EDIT: МОЯ ПОДХОД КАК ПОКА

  1. перебирать композитов.
    проходя вдоль Mediator Object
    , который содержит выходную библиотеку и библиотеку вычисления.

  2. если текущий лист является текст
    проверить, если ток является корнем
    если НЕТ визит библиотека вычисления для оценки фактического значения и передать его кому это может касаться (например, \ чтения(), \ varput(), ...)
    если ДА визит выход библиотека распечатать его

что приходит на ум, что я должен реализовать каждый requestMethod в обеих библиотеках, чтобы добиться автоматической корневой печати. то есть
\ read() в вывод должен печатать текст в документе,
\ read() в библиотеке вычислений следует искать значение члена.

Я чем-то смущаю здесь?

+0

что вы пытаетесь сделать это не может быть сделано с просто старым https://en.wikipedia.org/wiki/Composite_pattern? возможно, вам просто нужно немного пробежать по дереву? –

+0

1. Мой вопрос мог быть недостаточно явным. Я обновил описание проблемы. 2. Что для меня настолько непонятно и непонятно: Как определить правый обработчик для разных уровней структуры (если root ~> print to pdf, если не ~> вернуть вычисленное значение в root, так что это может быть – lance

+0

Это то, для чего предназначена рекурсия. Метод принимает вход, работает над тем, какой бит следующий, оценивает, был ли он последним бит или нет. Если ДА, возвращает некоторое значение, если НЕТ, удаляет обработанный бит с входа , и передает лишенный вход себе. – dbugger

ответ

0

продолжается от комментариев, и при условии, что вы построили свой композиционный дерево от вашего входа, то, что вам нужно, что не может быть сделано, как это:

import java.util.ArrayList; 
import java.util.List; 
interface Component { 
    void add(Component component); 
    List<Component> children(); 
} 
class Composite implements Component { 
    @Override public void add(Component component) { 
     children.add(component); 
    } 
    @Override public List<Component> children() { 
     return children; 
    } 
    List<Component> children=new ArrayList<>(); 
} 
class Leaf implements Component { 
    @Override public void add(Component component) { 
     throw new UnsupportedOperationException(); 
    } 
    @Override public List<Component> children() { 
     return null; 
    } 
} 
public class So34886186 { 
    static String indent(int n) { 
     String s=""; 
     for(int i=0;i<n;i++) 
      s+=" "; 
     return s; 
    } 
    static void print(Component root,Component component,int indent) { 
     if(component instanceof Leaf) 
      if(component.equals(root)) 
       System.out.println(indent(indent)+" root: leaf: "+component); 
      else System.out.println(indent(indent)+"not root: leaf: "+component); 
     else { 
      if(component.equals(root)) { 
       System.out.println(indent(indent)+" root: composite: "+component+": ("); 
       for(Component component2:((Composite)component).children) 
        print(root,component2,indent+4); 
       System.out.println(indent(indent)+")"); 
      } else { 
       System.out.println(indent(indent)+"not root: composite: "+component+": ("); 
       for(Component component2:((Composite)component).children) 
        print(root,component2,indent+4); 
       System.out.println(indent(indent)+")"); 
      } 
     } 
    } 
    public static void main(String[] args) { 
     Component root=new Composite(); 
     root.add(new Leaf()); 
     Component one=new Composite(); 
     root.add(one); 
     one.add(new Leaf()); 
     Component two=new Composite(); 
     root.add(two); 
     print(root,root,0); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^