首页 > 其他分享 >设计模式(八)组合

设计模式(八)组合

时间:2023-10-18 10:01:04浏览次数:26  
标签:name 组合 void AbstractFile Add override 设计模式 public

一、定义

组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。组合模式让客户端可以统一对待单个对象和组合对象。组合模式是一种结构型模式。

二、描述

包含以下三个角色:1、Component(抽象构件):它可以是接口或抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。在抽象构件中定义了访问及管理它的子构件的方法,例如增加子构件、删除子构件、获取子构件等。
2、Leaf(叶子构件):它在组合结构中表示叶子结点对象,叶子结点没有子节点,它实现了在抽象构件中定义的行为。对于那些访问及管理子构件的方法,可以通过抛出异常、提示错误等方式进行处理。
3、Composite(容器构件):它在组合结构中表示容器节点对象,容器节点包含子节点,其子节点可以是叶子结点,也可以是容器节点,它提供一个集合用于存储子节点,实现了在抽象构件中定义的行为,包括那些访问及管理子构件的方法,在其业务方法中可以递归调用其子节点的业务方法。

三、例子

X公司想要开发一个杀毒软件,该软件既可以针对某个文件夹杀毒,也可以针对某个指定的文件进行杀毒。该杀毒软件还可以根据各类文件的特点,为不同类型的文件提供不同的杀毒方式,例如图像文件(ImageFile)和文本文件(TextFile)的杀毒方式就有所差异。AbstractFile:抽象文件类,充当抽象构件

public abstract class AbstractFile
{
    public abstract void Add(AbstractFile file);
    public abstract void Remove(AbstractFile file);
    public abstract AbstractFile GetChild(int index);
    public abstract void KillVirus();
}

ImageFile、VideoFile、TextFile:图像文件、视频文件、文本文件类,充当叶子构件

public class ImageFile : AbstractFile
{
    private string name;

    public ImageFile(string name)
    {
        this.name = name;
    }

    public override void Add(AbstractFile file)
    {
        Console.WriteLine("对不起,系统不支持该方法!");
    }

    public override void Remove(AbstractFile file)
    {
        Console.WriteLine("对不起,系统不支持该方法!");
    }

    public override AbstractFile GetChild(int index)
    {
        Console.WriteLine("对不起,系统不支持该方法!");
        return null;
    }

    public override void KillVirus()
    {
        // 此处模拟杀毒操作
        Console.WriteLine("**** 对图像文件‘{0}’进行杀毒", name);
    }
}

public class TextFile : AbstractFile
{
    private string name;

    public TextFile(string name)
    {
        this.name = name;
    }

    public override void Add(AbstractFile file)
    {
        Console.WriteLine("对不起,系统不支持该方法!");
    }

    public override void Remove(AbstractFile file)
    {
        Console.WriteLine("对不起,系统不支持该方法!");
    }

    public override AbstractFile GetChild(int index)
    {
        Console.WriteLine("对不起,系统不支持该方法!");
        return null;
    }

    public override void KillVirus()
    {
        // 此处模拟杀毒操作
        Console.WriteLine("**** 对文本文件‘{0}’进行杀毒", name);
    }
}

public class VideoFile : AbstractFile
{
    private string name;

    public VideoFile(string name)
    {
        this.name = name;
    }

    public override void Add(AbstractFile file)
    {
        Console.WriteLine("对不起,系统不支持该方法!");
    }

    public override void Remove(AbstractFile file)
    {
        Console.WriteLine("对不起,系统不支持该方法!");
    }

    public override AbstractFile GetChild(int index)
    {
        Console.WriteLine("对不起,系统不支持该方法!");
        return null;
    }

    public override void KillVirus()
    {
        // 此处模拟杀毒操作
        Console.WriteLine("**** 对视频文件‘{0}’进行杀毒", name);
    }
}

Folder:文件夹类,充当容器构件

public class Folder : AbstractFile
{
    private IList<AbstractFile> fileList = new List<AbstractFile>();
    private string name;

    public Folder(string name)
    {
        this.name = name;
    }

    public override void Add(AbstractFile file)
    {
        fileList.Add(file);
    }

    public override void Remove(AbstractFile file)
    {
        fileList.Remove(file);
    }

    public override AbstractFile GetChild(int index)
    {
        return fileList[index];
    }

    public override void KillVirus()
    {
        // 此处模拟杀毒操作
        Console.WriteLine("---- 对文件夹‘{0}’进行杀毒", name);

        foreach (var item in fileList)
        {
            item.KillVirus();
        }
    }
}

Program:测试代码

AbstractFile folder1 = new Folder("EDC的资料");
AbstractFile folder2 = new Folder("图像文件");
AbstractFile folder3 = new Folder("文本文件");
AbstractFile folder4 = new Folder("视频文件");

AbstractFile image1 = new ImageFile("小龙女.jpg");
AbstractFile image2 = new ImageFile("张无忌.gif");

AbstractFile text1 = new TextFile("九阴真经.txt");
AbstractFile text2 = new TextFile("葵花宝典.doc");

AbstractFile video1 = new VideoFile("笑傲江湖.rmvb");
AbstractFile video2 = new VideoFile("天龙八部.mp4");

folder2.Add(image1);
folder2.Add(image2);

folder3.Add(text1);
folder3.Add(text2);

folder4.Add(video1);
folder4.Add(video2);

folder1.Add(folder2);
folder1.Add(folder3);
folder1.Add(folder4);

folder1.KillVirus();

四、总结

1、优点

(1)可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,使客户忽略了层次的差异,方便对整个层次结构进行控制。
(2)客户端可以一致地使用一个组合结构或其中单个对象,不必关心是单个对象还是整个结构,简化代码。
(3)增加新的容器构件和叶子构件都十分方便,无需对现有类库代码进行任何修改,符合开闭原则。
(4)为树形结构的面向对象实现提供了灵活地解决方案,可以形成复杂的树形结构,但对树形结构的控制却很简单。

2、缺点

(1)增加新构件时很难对容器中的构建类型进行限制。

标签:name,组合,void,AbstractFile,Add,override,设计模式,public
From: https://www.cnblogs.com/WinterSir/p/17341199.html

相关文章

  • c#设计模式-行为型模式 之 备忘录模式
    ......
  • 28 组合事件配合 v-modle 使用
    子级元素发生改变,父级元素及时做出相应的响应1.首先回顾v-modle,表单的语句,实时或者延时(.lazy)获得用户输入的信息2.侦听器watch,实时响应然后做出相关操作<h3>响应组件</h3><Search@Search="myAnser"/>响应:{{anser}}</template><script>importS......
  • 解析设计模式与设计原则:构建可维护性和可扩展性代码的重要性
    本文分享自华为云社区《深入解析设计模式与设计原则:构建可维护性和可扩展性代码的重要性》,作者:LionLong。一、为什么需要设计模式?1.1、设计模式的定义设计模式大概有23种。设计模式是指在软件开发中,经过验证的,用于解决在特定环境下,重复出现的,特定问题的解决方案。从定......
  • 设计模式之策略模式:让你的代码灵活应对不同的算法
    作为一个程序员,我们经常会面临着在不同的情况下选择不同的算法来解决问题的需求。这种情况下,策略模式是一个非常有用的设计模式。在本文中,我将向你介绍策略模式的概念、结构以及如何应用这个模式来使你的代码更灵活。1.什么是策略模式?策略模式是一种行为型设计模式,它允许在运行......
  • c#设计模式-行为型模式 之 访问者模式
    ......
  • 排列组合学习指南
    前置芝士卡特兰数性质组合数求法递推法1<=m,n<=1e3、constintN=2010,P=1e9+7;intC[N][N];//预处理voidinit(){for(inti=0;i<N;i++)C[i][0]=1;for(inti=1;i<N;i++)for(intj=1;j<=i;j++)C[i][j]=(C[i-1][j]+C[i-1][j-1])%P;}费马......
  • 设计模式02 —— UML
    设计模式02——UML本教程参考:菜鸟教程-学的不仅是技术,更是梦想!(runoob.com)参考书:《图解设计模式》本系列为本人学习笔记,和课程学习笔记,资料和参考均源自互联网,希望各位大佬多多指点!UML的概念UML的全称是UndefinedModelingLanguage(统一建模语言)是让系统可视化,让规格......
  • Java设计模式
    七大设计原则开闭原则:是指一个软件实体如类、模块和函数应该对扩展开放,对修改关闭依赖倒置原则:是指设计代码结构时,高层模块不应该依赖底层模块,二者都应该依赖其抽象而不依赖于具体。单一职责原则:是指一个Class/Interface/Method只负责一项职责。接口隔离原则:是指用多个专......
  • 设计模式01 —— 设计模式简介
    设计模式01——设计模式简介本教程参考:菜鸟教程-学的不仅是技术,更是梦想!(runoob.com)为本人学习笔记,和课程学习笔记,希望各位大佬多多指点!设计模式的简介设计模式可以看作一套被人反复使用的,多人知晓的代码设计的经验总结。设计模式是软件工程的基石。以下是完全版:设......
  • 组合模式--Java实现
    画类图以文件夹浏览为例;具体代码实现//AbstractFile.javapackageorg.example.design008;publicabstractclassAbstractFile{publicabstractvoidadd(AbstractFileelement);publicabstractvoidremove(AbstractFileelement);publicabstractvoid......