Composite Pattern
- Compose object into tree structures
- Ex. HashMap: You can add only one element or a subtree without any difference
- Component is an abstract class
Ex. Create a Menu that can accept accept a MenuItem or another Menu without any difference
--------------------- Main ----------------------------
public class CompositePattron {
public static void main(String args[]){
Menu mainMenu = new Menu("Main", "/main");
MenuComponent mainMenu2 = new MenuItem("Main", "/main");
mainMenu.add(mainMenu2);
System.out.println(mainMenu.toString());
}
}
- First create an abstract class to describe the behavior
- The method toString will be used to print all type of objects (Menu or MenuItem)
--------------- Abstract class --------------------------
public abstract class MenuComponent {
String head;
String path;
List<MenuComponent> list = new ArrayList<>();
/**
* @return the head
*/
public String getHead() {
return head;
}
/**
* @return the path
*/
public String getPath() {
return path;
}
public abstract String toString();
String print(MenuComponent mc){
StringBuilder sb = new StringBuilder(this.head);
sb.append(": ");
sb.append(this.path);
sb.append("\n");
return sb.toString();
}
public abstract MenuComponent add(MenuComponent mc);
public abstract MenuComponent remove(MenuComponent mc);
}
- Second create the Leaf object
- Because this is a leaf the methods add & remove doesn't have any functionality defined
---------------------- MenuItem ---------------------------------------
public class MenuItem extends MenuComponent {
public MenuItem(String head, String path) {
this.head = head;
this.path = path;
}
@Override
public String toString() {
return print(this);
}
@Override
public MenuComponent add(MenuComponent mc) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public MenuComponent remove(MenuComponent mc) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
- Create the Composite object, this object contains Leaf objects
- Due to the leaf objects the methods add & remove now have functionality.
------------------------ Menu ----------------------------
public class Menu extends MenuComponent{
public Menu(String head, String path){
this.head = head;
this.path = path;
}
@Override
public MenuComponent add(MenuComponent mc){
this.list.add(mc);
return mc;
}
@Override
public MenuComponent remove(MenuComponent mc){
this.list.remove(mc);
return mc;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder(this.head);
sb.append(print(this));
Iterator<MenuComponent> itr = this.list.iterator();
while(itr.hasNext()){
MenuComponent mc = itr.next();
sb.append(mc.toString());
}
return sb.toString();
}
}
Comentarios
Publicar un comentario