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

推荐订阅源

Latest news
Latest news
T
Troy Hunt's Blog
V
Vulnerabilities – Threatpost
L
LINUX DO - 热门话题
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Simon Willison's Weblog
Simon Willison's Weblog
V
V2EX
博客园 - 司徒正美
B
Blog RSS Feed
AWS News Blog
AWS News Blog
MyScale Blog
MyScale Blog
Scott Helme
Scott Helme
Cisco Talos Blog
Cisco Talos Blog
Last Week in AI
Last Week in AI
NISL@THU
NISL@THU
博客园 - Franky
P
Proofpoint News Feed
博客园_首页
C
CERT Recently Published Vulnerability Notes
雷峰网
雷峰网
S
Schneier on Security
P
Proofpoint News Feed
Hugging Face - Blog
Hugging Face - Blog
G
GRAHAM CLULEY
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
WordPress大学
WordPress大学
The Hacker News
The Hacker News
T
Threatpost
阮一峰的网络日志
阮一峰的网络日志
A
Arctic Wolf
Microsoft Azure Blog
Microsoft Azure Blog
T
The Exploit Database - CXSecurity.com
Engineering at Meta
Engineering at Meta
罗磊的独立博客
T
The Blog of Author Tim Ferriss
D
Darknet – Hacking Tools, Hacker News & Cyber Security
I
Intezer
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
K
Kaspersky official blog
SecWiki News
SecWiki News
云风的 BLOG
云风的 BLOG
美团技术团队
C
Cybersecurity and Infrastructure Security Agency CISA
博客园 - 【当耐特】
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Security Latest
Security Latest
C
Cyber Attacks, Cyber Crime and Cyber Security
B
Blog
S
Security Affairs

博客园 - peter he

LPCTSTR c++ 资源文件操作 - peter he Unicode-enabling Microsoft C/C++ Source Code big-endian和little-endian HeapAlloc和GlobalAlloc以及VirtualAlloc三者之间的关系 电脑运行中死机解决方案<经典> The most effiective core chinese journals Some ideas 电池缩水 操作系统缩水 显卡缩水(时钟频率、显存大小、显卡接口、显存位宽) 非Firefox浏览器检测组件 个人习惯培养计划 房价和肉价反应的真实社会 C++ Review Series 答辩开始 洗心革面, 重新开始 从“老公”的称呼来历,看男人地位的变迁 嵌入式系统 Boot Loader 技术内幕
The difference between Delegate and Composite
peter he · 2007-10-13 · via 博客园 - peter he
  • Letme state a theory: polymorphic behavior is always delegation of some sort, and thus delegation (to impliment polymorphism) always has a layer of indirection. Please find a problem here, so we can make this more succinct/correct, or dis/prove it.

    Lets also try to say what delegation is NOT.

    From my above theory, a simple subroutine may have responsibility for the computation of some part of a program, but a subroutine call is not delegation because it is direct. It lacks a layer of indirection. A function-pointer IS however, since it can point to any function, and the decision of what function it points to must already have been made when it is dereferenced and called. Even a switch/case statement can be delegation, provided it adds a layer of indirection.

    So what does OO and polymorphic behavior have to do with delegation, if delegation is such a simple, ubiquitous thing? Perhaps this is the real core of the matter. OO is about resolving polymorphic behavior by delegating to objects.

  • Betteryet: delegation is done by the caller, while indirection is a function of (dispatch to) the callee
    [/list:o]

    按照上面的定义,在delegate和delegatee之间必须有一层indirection。画个简单的示意图:

    代码

    1. 1:   
    2. A --> B   
    3. 2:   
    4. delegate -----> delegatee   
    5.      ^                  |   
    6.      |   indirection    |   
    7.      --------------------   

    代码

    1. part1   
    2. delegateA {   
    3.    delegateeB b;   
    4. void methodA() { b.methodB();}   
    5. }   
    6. delegateeB {   
    7. void methodB() {}   
    8. }   

    上面的代码就不是delegation,而是composition,因为直接调用了delegatee的方法,这只是forwarding methods。

    代码

    1. part2   
    2. delegateA {   
    3.     delegateeB b;   
    4. void methodA() { b.methodB(this); }      
    5. void do() {}   
    6. }   
    7. delegateeB {   
    8. void methodB(delegateA a) { a.do(); }   
    9. }   

    part2好像又回到了part1,其实不然,delegate已经把自身pass给了delegatee,并且delegatee调用了delegate的方法,这就是一种indirection。

    在现实世界中,假如董事长A把权利授权给总经理B,总经理B一定会获取董事长A才拥有的权利,它会利用这些权利来替公司做事。这才是真正的delegation,也就是说delegatee一定会调用delegate的某些方法,因此你首先得把delegate传递给delegatee。