惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Jina AI
Jina AI
V
Vulnerabilities – Threatpost
Security Latest
Security Latest
AI
AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
量子位
H
Help Net Security
Attack and Defense Labs
Attack and Defense Labs
The GitHub Blog
The GitHub Blog
L
LINUX DO - 最新话题
A
Arctic Wolf
博客园_首页
S
Securelist
S
Secure Thoughts
Google DeepMind News
Google DeepMind News
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
Tailwind CSS Blog
Apple Machine Learning Research
Apple Machine Learning Research
酷 壳 – CoolShell
酷 壳 – CoolShell
Stack Overflow Blog
Stack Overflow Blog
N
Netflix TechBlog - Medium
Cyberwarzone
Cyberwarzone
小众软件
小众软件
T
Threatpost
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Blog — PlanetScale
Blog — PlanetScale
N
News and Events Feed by Topic
NISL@THU
NISL@THU
Forbes - Security
Forbes - Security
博客园 - 聂微东
F
Fortinet All Blogs
Simon Willison's Weblog
Simon Willison's Weblog
H
Heimdal Security Blog
罗磊的独立博客
S
Security @ Cisco Blogs
B
Blog
T
Troy Hunt's Blog
Engineering at Meta
Engineering at Meta
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
The Hacker News
The Hacker News
The Last Watchdog
The Last Watchdog
Hacker News - Newest:
Hacker News - Newest: "LLM"
I
Intezer
T
Threat Research - Cisco Blogs
C
Cybersecurity and Infrastructure Security Agency CISA
The Cloudflare Blog
S
Schneier on Security
月光博客
月光博客
L
LINUX DO - 热门话题
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org

博客园 - Vengen

【笔记】DataTable或IList使用GroupBy方法的lamda表达式 WSS学习笔记(3) – 在“用户控件”中使用SPGridView WSS学习笔记(2) - 用QuickPart部署“用户控件”来替代WebPart WSS学习笔记(1) - 创建简单的WebPart 用ILmerge工具将C#中的EXE和DLL文件合并成单个文件 修改WordPress文章索引列表的日期格式 Windows7部署Android开发环境傻瓜式教程(Eclipse+ADT) 如何使用C#访问WordPress的xmlrpc.php - Vengen - 博客园 Windows7部署WordPress傻瓜式教程(IIS7.5+MySQL+PHP+WordPress) C#面向对象设计模式学习笔记(10) - Facade 外观模式(结构型模式) C#面向对象设计模式学习笔记(9) - Decorator 装饰模式(结构型模式) C#面向对象设计模式学习笔记(7) - Bridge 桥接模式(结构型模式) C#面向对象设计模式学习笔记(6) - Adapter 适配器模式(结构型模式) C#面向对象设计模式学习笔记(5) - Prototype 原型模式(创建型模式) C#面向对象设计模式学习笔记(4) - Factory Method 工厂方法模式(创建型模式) C#面向对象设计模式学习笔记(3) - Builder 生成器模式(创建型模式) C#面向对象设计模式学习笔记(2) - Abstract Factory 抽象工厂模式(创建型模式) - Vengen C#面向对象设计模式学习笔记(1) - Singleton 单件模式(创建型模式) C#面向对象设计模式学习笔记 - 开篇
C#面向对象设计模式学习笔记(8) - Composite 组合模式(结构型模式)
Vengen · 2009-12-12 · via 博客园 - Vengen

在某些情况下,客户代码过多地依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁变化,带来了代码的维护性、扩展性等弊端。

如何将“客户代码与复杂的对象容器结构”解耦?让对象容器自己来实现自身的复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂的对象容器?

意图:

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

image

public interface IBox
{
void Process();
void Add(IBox box);
void Remove(IBox box);
}
public class SingleBox : IBox
{
public void Process()
{
//1、Do process for myself
}public void Add(IBox box)
{
throw UnsuporttedException();
}
public void Remove(IBox box)
{
throw UnsuporttedException();
}
}
public class ContainerBox : IBox
{
ArrayList list
= null;public void Add(IBox box)
{
if (list == null)
{
list
= new ArrayList();
}
list.Add(box);
}
public void Remove(IBox box)
{
if (list == null)
{
throw new Exception();
}
list.Remove(box);
}
public void Process()
{
if (list != null)
{
//1、Do process for myself//2、Do process for the box in the list
foreach (IBox box in list)
{
box.Process();
}
}
}
}

//客户代码
class App
{
IBox box
= Factory.GetBox();
box.Process();
}

要点:

1、Composite模式采用树形结构来实现普遍存在的对象容器,从而将“一对多”的关系转化为“一对一”的关系,使得客户代码可以一致地处理对象和对象容器,无需关心处理的是单个的对象,还是组合的对象容器;

2、将“客户代码与复杂的对象容器结构”解耦是Composite模式的核心思想,解耦之后,客户代码将与纯粹的抽象接口——而非对象容器的复内部实现结构——发生依赖关系,从而更能“应对变化”。

3、Composite模式中,是将“Add和Remove等和对象容器相关的方法”定义在“表示抽象对象的Component类”中,还是将其定义在“表示对象容器的Composite类”中,是一个关乎“透明性”和“安全性”的两难问题,需要仔细权衡。这里有可能违背面向对象的“单一职责原则”,但是对于这种特殊结构,这又是必须付出的代价。ASP.NET控件的实现在这方面为我们提供了一个很好的示范。

4、Composite模式在具体实现中,可以让父对象中的子对象反向追溯;如果父对象有频繁的遍历需求,可使用缓存技巧来改善效率。