组合模式
2010-08-26 22:16 Clingingboy 阅读(765) 评论(0) 编辑 收藏 举报将对象以部分-整体的形式组成,如画图,可以画圆,画线,然后组成一幅图片,与装饰部同的是,这里是组合,装饰是扩展,组合模式是一个行为了的整合。但其又统一了部分和整体操作接口的统一性.
接口
// The Interface public interface IComponent <T> { void Add(IComponent <T> c); IComponent <T> Remove(T s); string Display(int depth); IComponent <T> Find(T s); T Name {get; set;} }
整体对象Composite
public class Composite <T> : IComponent <T> { List <IComponent <T>> list = null; public T Name {get; set;} public Composite (T name) { Name = name; list = new List <IComponent <T>> (); } public void Add(IComponent <T> c) { list.Add(c); } // Finds the item from a particular point in the structure // and returns the composite from which it was removed // If not found, return the point as given public IComponent <T> Remove(T s) { holder = this; IComponent <T> p = holder.Find(s); if (holder!=null) { (holder as Composite<T>).list.Remove(p); return holder; } else return this; } IComponent <T> holder=null; // Recursively looks for an item // Returns its reference or else null public IComponent <T> Find (T s) { holder = this; if (Name.Equals(s)) return this; IComponent <T> found=null; foreach (IComponent <T> c in list) { found = c.Find(s); if (found!=null) break; } return found; } // Displays items in a format indicating their level in the composite structure public string Display(int depth) { StringBuilder s = new StringBuilder(new String('-', depth)); s.Append("Set "+ Name + " length :" + list.Count + "\n"); foreach (IComponent <T> component in list) { s.Append(component.Display(depth + 2)); } return s.ToString(); } }
局部对象,注意这里的Add和Remove方法是无效的,因为其非集合.所以接口的这两个方法也是可以去掉的.
// The Component public class Component <T> : IComponent <T> { public T Name {get; set;} public Component (T name) { Name = name; } public void Add(IComponent <T> c) { Console.WriteLine("Cannot add to an item"); } public IComponent <T> Remove(T s) { Console.WriteLine("Cannot remove directly"); return this; } public string Display(int depth) { return new String('-', depth) + Name+"\n"; } public IComponent <T> Find (T s) { if (s.Equals(Name)) return this; else return null; } }
客户端调用
IComponent <string> album = new Composite<string> ("Album"); album.Add(new Component<string>("home.jpg")); album.Add(new Component<string>("home2.jpg")); album.Display(0);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2009-08-26 Spring.NET学习笔记(6)-基础AOP