
9.组合模式(Composite Pattern)
发布日期:2021-05-10 05:01:38
浏览次数:9
分类:技术文章
本文共 2265 字,大约阅读时间需要 7 分钟。
组合模式
在日常生活中可以发现很多整体-部分的关系,比如部门和员工,文件和文件夹等。
组合模式是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,使用户对单个对象和组合对象具有一致的访问性,属于结构型设计模式。
意图:将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
组合模式的主要优点有:
- 组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;
- 更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;
其主要缺点是:
- 设计较复杂,客户端需要花更多时间理清类之间的层次关系;
- 不容易限制容器中的构件;
- 不容易用继承的方法来增加构件的新功能;
这里我们已文件夹-文件举例,文件夹有添加,删除,重命名等功能,同理文件也有这些功能。类图如下。
using System;using System.Collections.Generic;namespace _09_Composite{ ////// 组合模式 /// class Program { static void Main(string[] args) { AbstractFile all = new Folder("all"); AbstractFile txt = new File("a.txt"); AbstractFile exe = new File("qq.exe"); all.Add(txt); all.Add(exe); all.PrintName(); Console.ReadKey(); } } abstract class AbstractFile { protected string filename; public AbstractFile(string name) { filename = name; } public abstract void Add(AbstractFile af); public abstract void Remove(AbstractFile af); public abstract void PrintName(); public void Operation() { } } class File : AbstractFile { public File(string name):base(name) { } public override void Add(AbstractFile af) { Console.WriteLine("Add a file"); } public override void Remove(AbstractFile af) { Console.WriteLine("Remove a file"); } public override void PrintName() { Console.WriteLine("Print a file name:{0}",filename); } } class Folder : AbstractFile { Listafs = new List (); public Folder(string name):base(name) { } public override void Add(AbstractFile af) { afs.Add(af); } public override void Remove(AbstractFile af) { afs.Remove(af); } public override void PrintName() { Console.WriteLine(filename); foreach (AbstractFile af in afs) { af.PrintName(); } } }}
转载地址:https://blog.csdn.net/u012869793/article/details/115554340 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2023年12月02日 21时47分58秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
asp.net获取iis相关信息
2019-03-28
Socket笔记和简单实例
2019-03-28
动态编译代码demo
2019-03-28
线程执行上下文传值
2019-03-28
WinForm之中BindingNavigator控件的使用
2019-03-28
BindingNavigator与DataGridView绑定
2019-03-28
深入.NET DataTable
2019-03-28
必须学习的.Net技术
2019-03-28
idea 中 alt+shift+z快捷键使用try catch
2019-03-28
函数何时执行以及this的总结(onclick为例)
2019-03-28
JS中用typeof进行判断的记录
2019-03-28
函数中传参修改对象的值,内存如何运作
2019-03-28
CSS中适配移动端完美视口像素记录
2019-03-28
【总结】原型链记录
2019-03-28
函数加深理解(onclick为例)
2019-03-28
创建对象使用键值对形式的加深理解
2019-03-28
z-index设置无效的试验
2019-03-28
用less写css中的记录(hover)
2019-03-28
js中的数据结构
2019-03-28