• 设计模式第九集——组合模式(Composite Pattern)


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

    比如图形界面,Frame或Panel是顶层组件包含其它组件(例如菜单、蚊子面板、滚动条、按钮)这样这个GUI包含了若干部分,当显示的时候认为是一个整体,告诉顶层组件显示,由顶层组件显示左右相关部分。这个包含其它组件的组件为组合对象,成没有包含其它组件的组件为叶节点。

    例如,餐厅有多种餐单(咖啡厅餐单、甜点餐单等等)餐单还有子餐单成树形结构。

     代码:

    MenuComponent

     1 package com;
     2 
     3 public abstract class MenuComponent {
     4     //组合的方法
     5     public void add(MenuComponent menuComponent){
     6         throw new UnsupportedOperationException();
     7     }
     8     public void remove(MenuComponent menuComponent){
     9         throw new UnsupportedOperationException();
    10     }
    11     public MenuComponent getChile(int i){
    12         throw new UnsupportedOperationException();
    13     }
    14     //操作方法
    15     public String getName(){
    16         throw new UnsupportedOperationException();
    17     }
    18     public String getDescription(){
    19         throw new UnsupportedOperationException();
    20     }
    21     public double getPrice(){
    22         throw new UnsupportedOperationException();
    23     }
    24     public void print(){
    25         throw new UnsupportedOperationException();
    26     }
    27 }

    MenuItem

     1 package com;
     2 
     3 public class MenuItem extends MenuComponent {
     4     String name;
     5     String description;
     6     double price;
     7     
     8     public MenuItem(String name, String description, double price) {
     9         
    10         this.name = name;
    11         this.description = description;
    12         this.price = price;
    13     }
    14 
    15     public String getName() {
    16         return name;
    17     }
    18     
    19     public String getDescription() {
    20         return description;
    21     }
    22     
    23     public double getPrice() {
    24         return price;
    25     }
    26     public void print(){
    27         System.out.println(" "+getName());
    28         System.out.println(", "+getPrice());
    29         System.out.println(" -- "+getDescription());
    30     }
    31     
    32     
    33     
    34 }

    Menu:

     1 package com;
     2 
     3 import java.util.ArrayList;
     4 import java.util.Iterator;
     5 
     6 public class Menu extends MenuComponent {
     7     ArrayList menuComponents = new ArrayList();
     8     String name;
     9     String description;
    10 
    11     public Menu(String name, String description) {
    12         this.name = name;
    13         this.description = description;
    14     }
    15 
    16     @Override
    17     public void add(MenuComponent menuComponent) {
    18         // TODO Auto-generated method stub
    19         menuComponents.add(menuComponent);
    20     }
    21 
    22     @Override
    23     public void remove(MenuComponent menuComponent) {
    24         // TODO Auto-generated method stub
    25         menuComponents.remove(menuComponent);
    26     }
    27 
    28     public MenuComponent getChile(int i) {
    29         // TODO Auto-generated method stub
    30         return (MenuComponent) menuComponents.get(i);
    31     }
    32 
    33     @Override
    34     public String getName() {
    35         // TODO Auto-generated method stub
    36         return name;
    37     }
    38 
    39     @Override
    40     public String getDescription() {
    41         // TODO Auto-generated method stub
    42         return description;
    43     }
    44 
    45     @Override
    46     public void print() {
    47         System.out.println("\n" + getName());
    48         System.out.println(", " + getDescription());
    49         System.out.println("--------------------");
    50 
    51         // 用迭代器 遍历所有餐单组件 若果在遍历中遇到了其他餐单或者遇到菜单项
    52         // 调用print()
    53         Iterator iterator = menuComponents.iterator();
    54         while (iterator.hasNext()) {
    55             MenuComponent menuComponent = (MenuComponent) iterator.next();
    56             menuComponent.print();
    57         }
    58     }
    59 
    60 }

    Waiteress

    package com;
    
    public class Waitress {
        MenuComponent allMenus;
    
        public Waitress(MenuComponent allMenus) {
            this.allMenus = allMenus;
        }
        
        public void printMenu(){
            allMenus.print();
        }
    
    }

    Test:

     1 package com;
     2 
     3 public class test {
     4     public static void main(String args[]){
     5         MenuComponent pancakeHouseMenu=new Menu("Pancake House Menu","Breakfast");
     6         MenuComponent dinerMenu=new Menu("Diner Menu","Lunch");
     7         MenuComponent CaffeeMenu=new Menu("Caffee Menu","Caffee");
     8         MenuComponent desertMenu=new Menu("Desert Menu","Desert");
     9         //加入餐单
    10         MenuComponent allMenus=new Menu("All Menus","All Menus combined");
    11         allMenus.add(pancakeHouseMenu);
    12         allMenus.add(dinerMenu);
    13         allMenus.add(CaffeeMenu);
    14         allMenus.add(desertMenu);
    15         
    16         //加入餐单中的具体内容
    17         dinerMenu.add(new MenuItem("Pasta","Apaghetti with Marinara",3.89));
    18         //在dinerMenu中加入另一个餐单desertMenu
    19         dinerMenu.add(desertMenu);
    20         desertMenu.add(new MenuItem("Apple Pie","Apple Pie",1.12));
    21         
    22         Waitress waitress =new Waitress(allMenus);
    23         waitress.printMenu();
    24     }
    25 
    26 }
  • 相关阅读:
    RECOVER DATABASE SKIP TABLESPACE
    mysql加解密函数
    node获取代码的svn版本号,并打包的时候,输出指定文件到打包后的项目里面
    layer.open iframe自动高度
    IIS部署.net5项目
    使用Windows命令行启动关闭服务(net,sc用法)(转)
    centos7 修改IP 设置静态IP,开启SSH
    链接PostgreSQL报错authentication method 10 not supported解决
    PostgreSQL Windows安装教程
    POI隐藏行 隐藏列,EasyExcel隐藏行 EasyExcel隐藏列
  • 原文地址:https://www.cnblogs.com/doublesong/p/2624855.html
Copyright © 2020-2023  润新知