Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.ArrayList;
- abstract class Component {
- private String name;
- Component(String name) {
- this.name = name;
- }
- String getName() {
- return name;
- }
- abstract void accept(Visitor visitor);
- }
- class Composite extends Component {
- private ArrayList<Component> components = new ArrayList<>();
- Composite(String name) {
- super(name);
- }
- void add(Component component) {
- components.add(component);
- }
- ArrayList<Component> getComponents() {
- return components;
- }
- void accept(Visitor v) {
- v.visit(this);
- }
- }
- class Element extends Component {
- void accept(Visitor v) {
- v.visit(this);
- }
- Element(String name) {
- super(name);
- }
- }
- public class Main {
- public static void main(String[] args) {
- Composite root = new Composite("root");
- root.add(new Element("element1"));
- Composite composite1 = new Composite("composite1");
- composite1.add(new Element("element2"));
- composite1.add(new Composite("composite2"));
- composite1.add(new Element("element3"));
- root.add(composite1);
- root.add(new Element("element4"));
- root.accept(new NameVisitor());
- }
- }
- interface Visitor {
- void visit(Composite composite);
- void visit(Element element);
- }
- class NameVisitor implements Visitor {
- private int depth = 0;
- private ArrayList<String> names = new ArrayList<>();
- public void visit(Composite composite) {
- names.add(composite.getName());
- ++depth;
- for (Component component: composite.getComponents()) {
- component.accept(this);
- }
- --depth;
- if (depth == 0) {
- display();
- }
- }
- public void visit(Element element) {
- names.add(element.getName());
- display();
- }
- private void display() {
- for (String name: names) {
- System.out.println(name);
- }
- }
- }
Add Comment
Please, Sign In to add comment