zoukankan      html  css  js  c++  java
  • 设计模式C#实现(十一)——组合模式

     

     

    意图

    将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。

    适用性

    • 你想表示对象的部分-整体层次结构
    • 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

    结构

    组合模式

    实现

    我们实现一个菜单结构,一个菜单可以包含子菜单或者菜单项

    定义一个抽象类,菜单和菜单项都继承自这个类

    public abstract class MenuComponet
        {
            public virtual void Add(MenuComponet menuComponet)
            {
                throw new Exception("不支持该方法");
            }
    
            public virtual void Remove(MenuComponet menuComponet)
            {
                throw new Exception("不支持该方法");
            }
    
            public virtual MenuComponet GetChild(int i)
            {
                throw new Exception("不支持该方法");
            }
    
            public virtual void Print()
            {
                throw new Exception("不支持该方法");
            }
    
        }
    

    菜单包含一个子节点列表

       public class Menu : MenuComponet
        {
            List<MenuComponet> _componets = new List<MenuComponet>();
            private string _name;
    
            public Menu(string name)
            {
                _name = name;
            }
    
            public override void Add(MenuComponet menuComponet)
            {
                _componets.Add(menuComponet);
            }
    
            public override void Remove(MenuComponet menuComponet)
            {
                _componets.Remove(menuComponet);
            }
    
            public override MenuComponet GetChild(int i)
            {
                return _componets[i];
            }
    
            public override void Print()
            {
                Console.WriteLine(_name+":");
                foreach (var c in _componets)
                {
                    Console.Write("--");
                    c.Print();
                }
            }
        }
    

    菜单项

     public class MenuItem : MenuComponet
        {
            private string _name;
            private float _price;
    
            public MenuItem(string name, float price)
            {
                _name = name;
                _price = price;
            }
    
            public override void Print()
            {
                Console.WriteLine("--"+_name + ": " + _price + "$");
            }
        }
    

    客户使用

     class Program
        {
            static void Main(string[] args)
            {
                MenuComponet allMenus = new Menu("Menu");
                MenuComponet breakfast = new Menu("breakfast");
                MenuComponet lunch = new Menu("lunch");
                MenuComponet dinner = new Menu("dinner");
    
                breakfast.Add(new MenuItem("Milk", 1.5f));
                breakfast.Add(new MenuItem("Egg", .5f));
    
                lunch.Add(new MenuItem("Hamburger", 3f));
                lunch.Add(new MenuItem("Sausage", 3f));
                lunch.Add(new MenuItem("French fries", 2f));
    
                MenuComponet food = new Menu("Food");
                MenuComponet drink = new Menu("Drink");
    
                food.Add(new MenuItem("Steak", 6f));
                food.Add(new MenuItem("Salad", 3f));
                food.Add(new MenuItem("Hamburger", 3f));
                drink.Add(new MenuItem("Beer", 1f));
                drink.Add(new MenuItem("Wine", 3f));
                dinner.Add(food);
                dinner.Add(drink);
    
                allMenus.Add(breakfast);
                allMenus.Add(lunch);
                allMenus.Add(dinner);
                allMenus.Print();
    
                Console.WriteLine("
     I wanna a beer");
                allMenus.GetChild(2).GetChild(1).GetChild(0).Print();
                Console.ReadKey();
            }
        }
    

    运行结果
    运行结果

    效果

    • 定义了包含基本对象(不含子节点)和组合对象(含有子节点)的类层次结构
    • 简化客户代码 客户不要关心使用的是组合对象和基本对象,因为使用方法是一致的
    • 容易增加新组件
    • 使设计跟加一般化
  • 相关阅读:
    [php代码]从svn获取指定版本,并同步到ftp上。
    java程序用pid重启
    Gearman安装,测试笔记
    ant编译android项目
    jquery代码收藏
    [读书笔记]读《code complete》有感
    无法解析的外部符号_main,该符号在函数_tmainCRTStartup中被引用
    4路电梯调度——pair program总结
    阅读作业2
    必应缤纷桌面的使用测试
  • 原文地址:https://www.cnblogs.com/castdream/p/5021710.html
Copyright © 2011-2022 走看看