zoukankan      html  css  js  c++  java
  • 设计模式之组合模式(十)

    设计模式之组合模式

    一、引言

      组合模式(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);
                }
            }
        }
    }
    目录类

    运行结果如下:

  • 相关阅读:
    django admin日期变为可以修改
    djangoadmin模块
    mac添加oh my zsh
    Dockerfile文件详解
    CC++初学者编程教程(4) 安装Oracle12c于Windows Sever2012
    Keli Linux与网络安全(2)——初探Keli
    Keli Linux与网络安全(1)——在VMWare中安装Keli系统
    C语言的本质(12)——指针与函数
    C语言的本质(11)——指针与数组
    C语言的本质(10)——指针本质
  • 原文地址:https://www.cnblogs.com/zkhbalance/p/9426559.html
Copyright © 2011-2022 走看看