Headfirst java设计模式-组合模式

组合模式:允许将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。

相关代码实现:
(1)实现一个MenuComponent抽象类

import java.util.Iterator;

public abstract class MenuComponent {
    public void add(MenuComponent menuComponent) {
        throw new UnsupportedOperationException();
    }
    public void remove(MenuComponent menuComponent) {
        throw new UnsupportedOperationException();
    }
    public MenuComponent getChild(int i) {
        throw new UnsupportedOperationException();
    }

    public String getName() {
        throw new UnsupportedOperationException();
    }
    public String getDescription() {
        throw new UnsupportedOperationException();
    }
    public double getPrice() {
        throw new UnsupportedOperationException();
    }
    public boolean isVegetarian() {
        throw new UnsupportedOperationException();
    }
    public void print() {
        throw new UnsupportedOperationException();
    }

    public abstract Iterator createIterator() ;
}

(2)继承menuComponent实现menu以及menuitem类

import java.util.ArrayList;
import java.util.Iterator;

public class Menu extends MenuComponent{
    ArrayList menuComponents = new ArrayList();
    String name;
    String description;

    public Menu(String name, String description) {
        this.name = name;
        this.description = description;
    }

    public void add(MenuComponent menuComponent) {
        menuComponents.add(menuComponent);
    }

    public void remove(MenuComponent menuComponent) {
        menuComponent.remove(menuComponent);
    }

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }

    public void print() {
        System.out.println("\n" + getName());
        System.out.println(", " + getDescription());
        System.out.println("------------------------");

        Iterator iterator = menuComponents.iterator();
        while (iterator.hasNext()) {
            MenuComponent menuComponent = (MenuComponent)iterator.next();
            menuComponent.print();
        }
    }

    @Override
    public Iterator createIterator() {
        // TODO Auto-generated method stub
        return new CompositeIterator(menuComponents.iterator());
    }
}

import java.util.Iterator;

public class MenuItem extends MenuComponent{
    String name;
    String description;
    boolean vegetarian;
    double price;

    public MenuItem(String name,
                     String description,
                     boolean vegetarian,
                     double price)
    {
        this.name = name;
        this.description = description;
        this.vegetarian = vegetarian;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }

    public double getPrice() {
        return price;
    }

    public boolean isVegetarian() {
        return vegetarian;
    }

    public void print() {
        System.out.print(" " + getName());
        if (isVegetarian()) {
            System.out.print("(v)");
        }
        System.out.println(", " + getPrice());
        System.out.println("   --- " + getDescription());
    }

    @Override
    public Iterator createIterator() {
        // TODO Auto-generated method stub
        return new NullIterator();
    }
}

(3)实现nullIterator以及compositeIterator


import java.util.Iterator;
import java.util.Stack;

public class CompositeIterator implements Iterator{
    Stack stack = new Stack();

    public CompositeIterator(Iterator iterator) {
        System.out.println("CompositeIterator.push : " + iterator.hashCode());
        stack.push(iterator);
    }

    public int hashCode(){
        if (stack.empty()) {
            return 0;
        } else {
            return ((Iterator) stack.peek()).hashCode();
        }
    }

    @Override
    public boolean hasNext() {
        // TODO Auto-generated method stub\
        if (stack.empty()) {
            return false;
        } else {
            Iterator iterator = (Iterator) stack.peek();
            if (!iterator.hasNext()) {
                System.out.println("stack.pop: " + iterator.hashCode());
                stack.pop();
                return hasNext();
            } else {
                return true;
            }
        }
    }

    @Override
    public Object next() {
        // TODO Auto-generated method stub
        if (hasNext()) {
            Iterator iterator = (Iterator) stack.peek();
            System.out.println("next: " + iterator.hashCode());
            MenuComponent component = (MenuComponent) iterator.next();
            if (component instanceof Menu) {
                System.out.println("stack.push : " + iterator.hashCode());
                stack.push(component.createIterator());
            }
            return component;
        } else {
            return null;
        }       
    }

    public void remove() {
        throw new UnsupportedOperationException();
    }
}

import java.util.Iterator;

public class NullIterator implements Iterator{

    @Override
    public boolean hasNext() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public Object next() {
        // TODO Auto-generated method stub
        return null;
    }

    public void remove() {
        throw new UnsupportedOperationException();
    }
}

(4)实现waitress类调用并实际打印菜单

import java.util.Iterator;

public class Waitress {
    MenuComponent allMenus;

    public Waitress(MenuComponent allMenus) {
        this.allMenus = allMenus;
    }

    public void printMenu() {
        allMenus.print();
        //printVegetarianMenu();
    }

    public void printVegetarianMenu() {
        Iterator iterator = allMenus.createIterator();
        System.out.println("\nVEGETARIAN MENU\n----");
        while (iterator.hasNext()) {
            System.out.println("get next: " + iterator.hashCode());
            MenuComponent menuComponent = (MenuComponent) iterator.next();
            try {
                if (menuComponent.isVegetarian()) {
                    System.out.println("print: " + iterator.hashCode());
                    menuComponent.print();
                }
            } catch (UnsupportedOperationException e){
                System.out.println("UnsupportedOperationException");
            }
        }
    }
}

(5)测试代码

public class MenuTestDrive {
    public static void main(String args[]) {
        MenuComponent pancakeHouseMenu = 
                new Menu("PANCAEK HOUSE MENU", "Breakfast");
        MenuComponent dinerMenu = 
                new Menu("DINER MENU", "Lunch");
        MenuComponent cafeMenu =
                new Menu("CAFE MENU", "Dinner");
        MenuComponent dessertMenu = 
                new Menu("DESSERT MENU", "Dessert of course!");
        MenuComponent allMenus = new Menu("ALL MENUS", "All menus combined");
        allMenus.add(pancakeHouseMenu);
        allMenus.add(dinerMenu);
        allMenus.add(cafeMenu);

        //
        dinerMenu.add(new MenuItem(
                "Pasta",
                "Spaghetti with Marinara Sauce, and a slice of sourdough bread",
                true,
                3.89));
        dinerMenu.add(dessertMenu);

        dessertMenu.add(new MenuItem(
                "Apple Pie",
                "Apple pie with flakey crust, topped with vanilla ice cream",
                true,
                1.59));

        Waitress waitress = new Waitress(allMenus);
        //waitress.printMenu();
        waitress.printVegetarianMenu();
    }
}

猜你喜欢

转载自blog.csdn.net/MoonShinesOnMyWay/article/details/81334921