设计模式学习笔记八——Composite模式

2024-04-27 22:08

本文主要是介绍设计模式学习笔记八——Composite模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

动机:客户代码过多地依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁变化,带来了代码维护性、扩展性等弊端。本模式通过将对象组合成树形结构以表示“部分-整体”的层次结构,让组合对象实现自身的复杂结构,使得用户对单个对象和组合对象的使用具有一致性。

应用:ASP.NET子父控件关系。

场景:以树为例,叶子为最低级原子节点,树为容器,可以包括子树和叶子。需要使客户程序对树和叶子的处理一致,保持透明性,而不需要关心处理的是树还是叶子。

结构

Composite设计模式结构图


代码实现

namespace  DesignPattern.Composite
{
    
public interface ITree
    
{
        
void Process();
        
void Add(ITree tree);
        
void Remove(ITree tree);
    }


    
public class Leaf : ITree
    
{
        
public void Process()
        
{
        }


        
public void Add(ITree tree)
        
{
            
throw new Exception("叶子不支持该方法!");
        }


        
public void Remove(ITree tree)
        
{
            
throw new Exception("叶子不支持该方法!");
        }

    }


    
public class Tree : ITree
    
{
        IList
<ITree> treeCollection = null;

        
public void Process()
        
{
            
foreach (ITree tree in treeCollection)
            
{
                tree.Process();
            }

        }


        
public void Add(ITree tree)
        
{
            treeCollection.Add(tree);
        }


        
public void Remove(ITree tree)
        
{
            treeCollection.Remove(tree);
        }

    }

}

/*
 * 树工厂
*/

namespace  DesignPattern.Composite
{
    
public class TreeFactory
    
{
        
public static ITree GetTree()
        
{
            
return (ITree)Assembly.Load("DesignPattern.Composite").CreateInstance("DesignPattern.Composite" + "." + System.Configuration.ConfigurationSettings.AppSettings["TreeName"].ToString());
        }

    }

}

/*
 * 客户程序
*/

namespace  DesignPattern.Composite
{
    
public class TreeClient
    
{
        ITree tree;
        
public TreeClient()
        
{
            tree 
= TreeFactory.GetTree();
        }


        
public void ProcessTree()
        
{
            
// 客户代码依赖抽象接口
            tree.Process();
        }

    }

}



要点:
1、本模式采用树形结构来实现普遍存在的对象容器,从而将“一对多” 的关系转化为“一对一”的关系,使得客户代码可以一致地处理单个对象和对象容器,而无需关心处理的是单个对象还是组合的对象容器。
2、将“客户代码与复杂的对象容器结构”解耦是本模式的核心思想,解耦之后,客户代码将与纯粹的抽象接口——而非对象容器的复杂内部实现结构——发生依赖关系,从而能够应对变化。
3、本模式中,将单个对象不具有的操作的(如Add和Remove)定义于接口或抽象类中,还是组合对象中,需要从透明性和安全性两方面平衡考虑。应用此模式,更强调透明性,所以有可能违背面向对象的“单一职责”原则。
 4、本模式在具体实现中,可以让父对象中的子对象反向追溯;如果父对象有频繁的遍历需求,可使用缓存来改善性能。  

这篇关于设计模式学习笔记八——Composite模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/941660

相关文章

Go语言实现桥接模式

《Go语言实现桥接模式》桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化,本文就来介绍一下了Go语言实现桥接模式,感兴趣的可以了解一下... 目录简介核心概念为什么使用桥接模式?应用场景案例分析步骤一:定义实现接口步骤二:创建具体实现类步骤三:定义抽象类步骤四:创建扩展抽象类步

C++中的解释器模式实例详解

《C++中的解释器模式实例详解》这篇文章总结了C++标准库中的算法分类,还介绍了sort和stable_sort的区别,以及remove和erase的结合使用,结合实例代码给大家介绍的非常详细,感兴趣... 目录1、非修改序列算法1.1 find 和 find_if1.2 count 和 count_if1

Redis中群集三种模式的实现

《Redis中群集三种模式的实现》Redis群集有三种模式,分别是主从同步/复制、哨兵模式、Cluster,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1. Redis三种模式概述2、Redis 主从复制2.1 主从复制的作用2.2 主从复制流程2

深入理解MySQL流模式

《深入理解MySQL流模式》MySQL的Binlog流模式是一种实时读取二进制日志的技术,允许下游系统几乎无延迟地获取数据库变更事件,适用于需要极低延迟复制的场景,感兴趣的可以了解一下... 目录核心概念一句话总结1. 背景知识:什么是 Binlog?2. 传统方式 vs. 流模式传统文件方式 (非流式)流

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚