Delegation 定義:
Delegation is a way of making composition as powerful for reuse as inheritance [Lie86, JZ91]. In delegation, two objects are involved in handling a request: a receiving object delegates operations to its delegate. This is analogous to subclasses deferring requests to parent classes. But with inheritance, an inherited operation can always refer to the receiving object through the this member variable in C++ and self in Smalltalk. To achieve the same effect with delegation, the receiver passes itself to the delegate to let the delegated operation refer to the receiver
我的理解:
??? A 把外界傳來(lái)的訊息" 轉(zhuǎn)送" 給B ﹐由B 處理之﹐我們稱A 委托B 。當(dāng)一些事物互相溝通分工合作時(shí)常用妥托觀念。
值得注意的是:
delegate -----> delegatee
? ? ?^? ? ? ? ? ? ? ? ? |
? ? ?|? ?indirection? ? |
? ? ?--------------------
delegate將自己(對(duì)象)傳給delegatee,使delegatee可以通過(guò)該對(duì)象執(zhí)行那些委托的操作。
舉個(gè)例子:
??? 在某個(gè)框架的組成部分中,對(duì)窗口設(shè)計(jì),可以支持任意形狀的窗口。
??? 開(kāi)始的時(shí)候考慮是不是使用子類來(lái)實(shí)現(xiàn),乍一看似乎是比較好的,但是考慮到對(duì)窗口來(lái)說(shuō)形狀只能是它的一項(xiàng)屬性:窗口不是一“種”形狀——窗口“有”形狀。(引自《The Pragmatic Programmer》)所以采用委托的方式。
??? 這時(shí),我們定義一個(gè)被委托(delegatee)類Shape和一個(gè)委托(delegate)類window。
public abstract class Shape{?????????????????
??? //....???????????????????????????????????
??? public abstract boolean overlaps(Shape s);
??? public abstract int getArea();???????????
}????????????????????????????????????????????
public class window{?????????????????????????
??? private Shape shape;?????????????????????
??? public window(Shape shape){??????????????
??????? this.shape = shape;??????????????????
??????? ...??????????????????????????????????
??? }?????????????????????????????????????????
??? public void setShape(Shape shape){???????
??????? this.shape = shape;??????????????????
??????? ...??????????????????????????????????
??? }????????????????????????????????????????
??? public boolean overlaps(window w){???????
??????? return shape.overlaps(w);??????????? ?
??? }????????????????????????????????????????
??? public int getArea(){????????????????????
??????? return shape.getArea();??????????????
??? }????????????????????????????????????????
}????????????????????????????????????????????
class引自《The Pragmatic Programmer》)