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

本文介绍组合模式,通过将对象组合成树形结构以表示部分-整体的层次结构,使得用户对单个对象和组合对象的使用具有一致性。文中详细阐述了组合模式的应用场景、结构及其实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

应用: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、本模式在具体实现中,可以让父对象中的子对象反向追溯;如果父对象有频繁的遍历需求,可使用缓存来改善性能。  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值