首页 > 其他分享 >组合模式

组合模式

时间:2023-05-30 17:11:34浏览次数:28  
标签:组合 Composite void Component 模式 Add new public

一、定义

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

二、应用实例

文件系统中的文件与文件夹、Winform中的简单控件与容器控件、XML中的Node和Element等。

透明模式

透明模式是把组合使用的方法放到抽象类中,使得叶子对象和枝干对象具有相同的结构,客户端调用时具备完全一致的行为接口。但因为Leaf类本身不具备Add()、Remove()方法的功能,所以实现它是没有意义的,违背了单一职责原则和里氏替换原则。

安全模式

安全模式是把枝干和叶子节点区分开来,枝干单独拥有用来组合的方法,这种方法比较安全。但枝干和叶子节点不具有相同的接口,客户端的调用需要做相应的判断,违背了依赖倒置原则。

三、优缺点

优点

  • 客户端调用简单,可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
  • 可以方便的在结构中增加或者移除对象。

缺点

  • 客户端需要花更多时间理清类之间的层次关系

四、示例

 

下面代码是用透明模式实现的

1.Component.cs

public abstract class Component
    {
        public string Name { get; set; }

        public Component(string name)
        {
            this.Name = name;
        }

        public abstract int SumArticleCount();
public abstract void Add(Component component);
public abstract void Remove(Component component); public abstract void Display(int depth); }

2.Composite.cs

public class Composite : Component
    {
        private List<Component> _components = new List<Component>();

        public Composite(string name):base(name)
        {
        }
public override void Add(Component component) { _components.Add(component); } public override void Remove(Component component) { _components.Remove(component); } public override void Display(int depth) { Console.WriteLine(new string('-', depth) + Name); foreach (Component component in _components) { component.Display(depth + 1); } } public override int SumArticleCount() { int count = 0; foreach (var item in _components) { count += item.SumArticleCount(); } return count; } }

3.Leaf.cs

public class Leaf : Component
    {
        public Leaf(string name) : base(name)
        {
        }

        public override void Add(Component component)
        {
            throw new InvalidOperationException("叶子节点不能添加元素");
        }

        public override void Remove(Component component)
        {
            throw new InvalidOperationException("叶子节点不能删除元素");
        }

        public override int SumArticleCount()
        {
            return 1;
        }

        public override void Display(int depth)
        {
            Console.WriteLine(new string('-', depth) + Name);
        }
    }

4.Program.cs

internal class Program
    {
        static void Main(string[] args)
        {
            Component root = new Composite("目录");

            Component music = new Composite("音乐");
            Component knowledge = new Composite("知识");
            Component life = new Composite("生活");
            root.Add(music);
            root.Add(knowledge);
            root.Add(life);

            Component science = new Composite("科学科普");
            Component tech = new Composite("野生技术协会");
            knowledge.Add(science);
            knowledge.Add(tech);

            Component scienceArticle1 = new Leaf("科学科普文章1");
            Component scienceArticle2 = new Leaf("科学科普文章2");
            science.Add(scienceArticle1);
            science.Add(scienceArticle2);

            Component shoot = new Composite("摄影");
            Component program = new Composite("编程");
            Component english = new Composite("英语");
            tech.Add(shoot);
            tech.Add(program);
            tech.Add(english);

            Component shootArticle1 = new Leaf("摄影文章1");
            Component lifeArticle1 = new Leaf("生活文章1");
            Component lifeArticle2 = new Leaf("生活文章2");
            shoot.Add(shootArticle1);
            life.Add(lifeArticle1);
            life.Add(lifeArticle2);
           
            root.Display(0);
            Console.WriteLine("文章数:" + root.SumArticleCount());
        }
    }

运行结果:

 

标签:组合,Composite,void,Component,模式,Add,new,public
From: https://www.cnblogs.com/xiao-wo-niu/p/17443755.html

相关文章

  • gof-设计模式
    一、什么是设计模式设计模式(Designpattern)是解决软件开发某些特定问题而提出的一些解决方案也可以理解成解决问题的一些思路。通过设计模式可以帮助我们增强代码的可重用性、可扩充性、可维护性、灵活性好。我们使用设计模式最终的目的是实现代码的高内聚和低耦合。1、创建型......
  • 工厂模式:一个即可简单实现,又可复杂实现的模式
    工厂模式的实现主要分为三种,分别是简单工厂模式(SimpleFactory)、工厂方法模式(FactoryMethod)和抽象工厂模式(AbastractFactory );但是简单工厂模式不属于23种GOF设计模式之一。工厂模式在各种开源框架里使用非常普遍,例如Spring框架大量使用工程模式。下面分别介绍一下这三种实现。0x......
  • 单例模式简单复杂,线程不安全到安全
    0x01:简介说到单例模式,可以说单例模式是最常见,也是最常用的设计模式了。Spring的bean默认就是单例的。虽然单例模式是最简单的设计模式,但是在实现上有多种方式,分别是饿汉式、懒汉式、双重校验锁;在线程安全方面有线程不安全的,也有线程相对安全的。总的来说实现单例模式有以下一些特......
  • 模板模式:一种体现多态的设计模式
    0x01:模板模式模板模式(Template),又叫模板方法模式(TemplateMethod),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需重写方法实现,但调用将以抽象类中定义的方式进行。模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,......
  • 被用到炉火纯清的迭代器模式
    0x01:迭代器模式简介Java中可以说已经把迭代器模式用到了极致,每一个集合类都关联了一个迭代器类Iterator。迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。UML类图如下:其中,Aggregate是聚集抽象类,负责提供创建具体迭代器角色的接口;Iter......
  • 傀儡政权之代理模式
    代理模式应用非常广泛,特别java领域的Spring框架,可以说把代理模式运用到极致。其中Spring的代理又分JDK动态代理和cglib动态代理。这类不打算深入讲解Spring的动态代理,而是深入讲解一下GOF23的代理模式。0x01:代理模式代理模式:给某一个对象提供一个代理对象,并由代理对象控制对原对象......
  • 面相对象设计模式目录
    写了个具体模式代码实现示例(c#):https://gitee.com/idasheng/DesignPattenDemo更新于:2023.5.30......
  • 桥接模式
    一、定义桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。UML类图Abstraction:抽象化角色,并保存一个对实现化对象的引用。RefinedAbstraction:修正抽象化角色,改变和修正父类对抽象化的定义。Implementor:实现化角色,这个角色给出实现化角色的接口,但不给出具体的实......
  • RabbitMQ 工作模式介绍
    RabbitMQ工作模式介绍1.HelloWorldRabbitMQ是一个消息代理:它接受并转发消息。您可以将其视为邮局:当您将要邮寄的邮件放入邮箱时,您可以确定信使最终会将邮件交付给您的收件人。在这个类比中,RabbitMQ是一个邮政信箱,一个邮局和一个信件载体。RabbitMQ和邮局之间的主要区别在于......
  • 工厂模式和抽象工厂模式区别
    1、工厂模式定义产品接口即可,工厂中生产得是产品对象2、抽象工厂模式需要定义产品接口,工厂抽象类。工厂生产得是具体工厂对象。3、工厂为啥使用抽象类而不使用接口:接口可以实现多个,而继承是单继承。例如:常见工厂,小米,华为,长城,他们都是一个整体,但是不可能出现一个小米华为长城的......