/**
* Component
*/
public abstract class TextPart {
protected List value = new ArrayList();
public String getValue() {
StringBuilder sb = new StringBuilder();
for (TextPart textPart : value) {
sb.append(textPart.getValue());
}
return sb.toString();
}
public void append(TextPart... textPart) {
for (TextPart part : textPart) {
value.add(part);
}
}
}
/**
* Composite
*/
public class Sentence extends TextPart {
public Sentence(TextPart... value) {
for (TextPart textPart : value) {
this.value.add(textPart);
}
}
}
/**
* Composite
*/
public class Paragraph extends Sentence {
public Paragraph(TextPart... value) {
super(value);
}
@Override
public String getValue() {
return " " + super.getValue() + "\n\n";
}
}
/**
* Leaf
*/
public class Symbol extends TextPart {
private char value;
public Symbol(char value) {
this.value = value;
}
@Override
public String getValue() {
return String.valueOf(value);
}
@Override
public void append(TextPart... textPart) {
throw new UnsupportedOperationException();
}
}
public class Client {
public static void main(String[] args) {
Sentence sentence1 = new Sentence(
new Symbol('H'),
new Symbol('e'),
new Symbol('l'),
new Symbol('l'),
new Symbol('o')
);
System.out.println(sentence1.getValue());
Sentence sentence2 = new Sentence(
new Symbol('w'),
new Symbol('o'),
new Symbol('r'),
new Symbol('l'),
new Symbol('d'),
new Symbol('!')
);
Sentence sentence3 = new Sentence(sentence1, new Symbol(' '), sentence2);
System.out.println(sentence3.getValue());
Paragraph paragraph = new Paragraph(sentence3, new Symbol(' '), sentence3);
System.out.println(paragraph.getValue());
}
}
/**
* Output:
* Hello
* Hello world!
* Hello world! Hello world!
*/
вторник, 11 октября 2011 г.
Паттерн Компоновщик (Composite). Пример кода
Подписаться на:
Комментарии к сообщению (Atom)
В классе TextPart первая строка должна быть:
ОтветитьУдалитьprotected List value = new ArrayList();
Да, я видел год публикации, но пример отличный. На других рус. ресурсах повторяющийся пример с Graphics.
Список TextPart у нас, поэтому :
УдалитьList value = new ArrayList();
for each обходит объекты TextPart.