• 设计模式之组合模式(十)


    设计模式之组合模式

    一、引言

      组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

    二、介绍

    意图:将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

    主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

    何时使用: 1、您想表示对象的部分-整体层次结构(树形结构)。 2、您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

    如何解决:树枝和叶子实现统一接口,树枝内部组合该接口。

    关键代码:树枝内部组合该接口,并且含有内部属性 List,里面放 Component。

    应用实例: 1、算术表达式包括操作数、操作符和另一个操作数,其中,另一个操作符也可以是操作数、操作符和另一个操作数。 2、在 JAVA AWT 和 SWING 中,对于 Button 和 Checkbox 是树叶,Container 是树枝。

    优点: 1、高层模块调用简单。 2、节点自由增加。

    缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

    使用场景:部分、整体场景,如树形菜单,文件、文件夹的管理。

    注意事项:定义时为具体类。

    三、UML图解

    四、代码展示

    文件系统中,我们可以创建文件(简单对象),也可以创建目录(复杂对象,目录中又可以创建文件或者目录),为了给用户一个良好的调用效果,我们可以使用组合模式。

    namespace Composite
    {
        /// <summary>
        /// 组合设计模式
        /// </summary>
        class Program
        {
            static void Main(string[] args)
            {
                // Console.WriteLine("Hello World!");
                Compoment compoment = new File("文件一");
                Compoment c = new Directory("目录一");
                c.Add(new File("目录一中的子文件一"));
                c.Add(new File("目录一中的子文件二"));
                c.Add(new Directory("目录一中的子目录一"));
                compoment.Show(); 
                c.Show();
                Console.ReadKey();
    
                //===========================================
                //Directory d = c as Directory;
                //foreach (Compoment one in d.compomentList)
                //{
                //    if (one.name == "目录一中的子目录一")
                //    {
                //        one.Add(new File("目录一中的子目录一中的子目录一"));
                //    }
                //}
    
            }
        }
    }
    主程序
    namespace Composite
    {
        /// <summary>
        /// 抽象组件
        /// </summary>
        public abstract class Compoment
        {
            public string name;
            public Compoment(string name) {
                this.name = name;
            }
            //增加
            public abstract void Add(Compoment name);
            //删除
            public abstract void Delete(Compoment name);
            //展示
            public abstract void Show();
        }
    }
    抽象组件
    namespace Composite
    {
        public class File : Compoment
        {
            public File(string name):base(name) {
               
            }
            public override void Add(Compoment name)
            {
                throw new NotImplementedException("文件类型不支持添加功能");
            }
    
            public override void Delete(Compoment name)
            {
                throw new NotImplementedException("文件类型不支持删除功能");
            }
    
            public override void Show()
            {
                Console.WriteLine(this.name);
            }
        }
    }
    文件类
    namespace Composite
    {
        public class Directory : Compoment
        {
            public Directory(string name) : base(name) {
                
            }
            public List<Compoment> compomentList ;
            public override void Add(Compoment name)
            {
                if (compomentList == null) {
                    compomentList = new List<Compoment>();
                }
                compomentList.Add(name);
            }
    
            public override void Delete(Compoment name)
            {
                compomentList.Remove(name);
            }
    
            public override void Show()
            {
                foreach (Compoment one in compomentList) {
                    Console.WriteLine(one.name);
                }
            }
        }
    }
    目录类

    运行结果如下:

  • 相关阅读:
    常用知识点集合
    LeetCode 66 Plus One
    LeetCode 88 Merge Sorted Array
    LeetCode 27 Remove Element
    LeetCode 26 Remove Duplicates from Sorted Array
    LeetCode 448 Find All Numbers Disappeared in an Array
    LeetCode 219 Contains Duplicate II
    LeetCode 118 Pascal's Triangle
    LeetCode 119 Pascal's Triangle II
    LeetCode 1 Two Sum
  • 原文地址:https://www.cnblogs.com/zkhbalance/p/9426559.html
Copyright © 2020-2023  润新知