組合模式

定義

將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu),使得用戶(hù)對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性

釋義:

  • 該模式屬于結(jié)構(gòu)型模式,主要用于處理對(duì)象與對(duì)象之間的包含關(guān)系和分層關(guān)系缆娃,比如文件系統(tǒng)洛退,XML文件等
  • 單個(gè)對(duì)象與組合對(duì)象的使用一致性表示需要抽象出其相同的地方窘拯,比如文件系統(tǒng)中文件和目錄都具有文字,是否隱藏,權(quán)限控制等。

角色介紹:

  • Component 是組合中的對(duì)象聲明接口缨该,在適當(dāng)?shù)那闆r下,實(shí)現(xiàn)所有類(lèi)共有接口的默認(rèn)行為川背。聲明一個(gè)接口用于訪(fǎng)問(wèn)和管理Component
    子部件贰拿。
  • Leaf 在組合中表示葉子結(jié)點(diǎn)對(duì)象,葉子結(jié)點(diǎn)沒(méi)有子結(jié)點(diǎn)熄云。
  • Composite 定義有枝節(jié)點(diǎn)行為膨更,用來(lái)存儲(chǔ)子部件,在Component接口中實(shí)現(xiàn)與子部件有關(guān)操作缴允,如增加(add)和刪除
    (remove)等荚守。

實(shí)現(xiàn)

本次實(shí)現(xiàn)我們參照Android中View架構(gòu)設(shè)計(jì)一個(gè)針對(duì)圖片編輯的框架,比如添加/刪除文字,添加/刪除貼紙等

public abstract class Element {
    Rect mLayout;
    Element mParent;
    Element mFocusElement;

    public abstract void draw(Canvas canvas);
    public abstract void move(int x, int y);
    public abstract boolean onTouchEvent(MotionEvent motionEvent);
    public Element getParent(){
        return mParent;
    }
    public Element getFocusElement(){
        return mFocusElement;
    }

}
public class StickerElemet extends Element {
    @Override
    public void draw(Canvas canvas) {
    }
    
    @Override
    public void move(int x, int y) {
    }

    @Override
    public boolean onTouchEvent(MotionEvent motionEvent) {
        return false;
    }
}
public class TextElement extends Element {
    @Override
    public void draw(Canvas canvas) {
    }

    @Override
    public void move(int x, int y) {
    }

    @Override
    public boolean onTouchEvent(MotionEvent motionEvent) {
        return false;
    }
}

Element是所有元素的頂級(jí)抽象矗漾,TextElement和StickerElement是單個(gè)元素的具體實(shí)現(xiàn)類(lèi)锈候,分別表示文本元素和貼紙?jiān)兀唧w的Element實(shí)現(xiàn)者只負(fù)責(zé)處理自己的繪制和觸摸事件等缩功,不能操作其父節(jié)點(diǎn)和兄弟節(jié)點(diǎn)晴及。

public interface ElementManager {
    public void addElement(Element element);
    public void removeElement(Element element);
}

ElementManager是元素管理接口都办,定義了元素的增加和刪除接口嫡锌,其實(shí)現(xiàn)類(lèi)需要實(shí)現(xiàn)約定接口功能。

public abstract class ElementGroup extends Element implements ElementManager{

    List<Element> mChildren = new ArrayList<>();

    @Override
    public boolean onTouchEvent(MotionEvent motionEvent) {
        return false;
    }

    public abstract boolean onIntercepted(MotionEvent motionEvent);

    public abstract boolean dispatchTouchEvent(MotionEvent motionEvent);

    public abstract void drawChildren(Canvas canvas);

    public abstract Element getChildren(int position);

    public abstract void justOrder();
}

ElementGroup是Element的組合對(duì)象的抽象類(lèi)琳钉,可以看到其實(shí)現(xiàn)ElementManager接口势木,ElementGroup實(shí)現(xiàn)者的職責(zé)是管理Element子節(jié)點(diǎn),主要是元素操作(增加歌懒,刪除啦桌,調(diào)整zOrder等),事件分發(fā)等及皂。

總結(jié)

從上述demo可以看出甫男,組合模式對(duì)于元素之間的隔離是比較高的,客戶(hù)端程序不必關(guān)心元素具體類(lèi)型验烧,而且可以動(dòng)態(tài)添加元素和容器板驳。其缺點(diǎn)是在構(gòu)建組合元素時(shí),很可能會(huì)依賴(lài)具體的組合元素類(lèi)型碍拆,所以盡可能將組合元素進(jìn)行抽象若治,并且獨(dú)立元素操作接口(增刪改查),使客戶(hù)端面向接口來(lái)操作感混。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末端幼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子弧满,更是在濱河造成了極大的恐慌婆跑,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庭呜,死亡現(xiàn)場(chǎng)離奇詭異洽蛀,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)疟赊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)郊供,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人近哟,你說(shuō)我怎么就攤上這事驮审。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵疯淫,是天一觀(guān)的道長(zhǎng)地来。 經(jīng)常有香客問(wèn)我,道長(zhǎng)熙掺,這世上最難降的妖魔是什么未斑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮币绩,結(jié)果婚禮上蜡秽,老公的妹妹穿的比我還像新娘。我一直安慰自己缆镣,他們只是感情好芽突,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著董瞻,像睡著了一般寞蚌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钠糊,一...
    開(kāi)封第一講書(shū)人閱讀 51,598評(píng)論 1 305
  • 那天挟秤,我揣著相機(jī)與錄音,去河邊找鬼抄伍。 笑死艘刚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的逝慧。 我是一名探鬼主播昔脯,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼笛臣!你這毒婦竟也來(lái)了云稚?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤沈堡,失蹤者是張志新(化名)和其女友劉穎静陈,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體诞丽,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鲸拥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了僧免。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刑赶。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖懂衩,靈堂內(nèi)的尸體忽然破棺而出撞叨,到底是詐尸還是另有隱情金踪,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布牵敷,位于F島的核電站胡岔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏枷餐。R本人自食惡果不足惜靶瘸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望毛肋。 院中可真熱鬧怨咪,春花似錦、人聲如沸村生。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)趁桃。三九已至,卻和暖如春肄鸽,著一層夾襖步出監(jiān)牢的瞬間卫病,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工典徘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蟀苛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓逮诲,卻偏偏與公主長(zhǎng)得像帜平,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子梅鹦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 繼承是is-a的關(guān)系裆甩。組合和聚合有點(diǎn)像,有些書(shū)上沒(méi)有作區(qū)分齐唆,都稱(chēng)之為has-a嗤栓,有些書(shū)上對(duì)其進(jìn)行了較為嚴(yán)格區(qū)分,組...
    時(shí)待吾閱讀 460評(píng)論 0 1
  • 1.初識(shí)組合模式 將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)箍邮。組合模式使得用戶(hù)對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具...
    王偵閱讀 1,066評(píng)論 0 2
  • 【學(xué)習(xí)難度:★★★☆☆茉帅,使用頻率:★★★★☆】直接出處:組合模式梳理和學(xué)習(xí):https://github.com/...
    BruceOuyang閱讀 994評(píng)論 0 1
  • 本文的主要內(nèi)容: 介紹組合模式 示例 組合模式總結(jié) 源碼分析組合模式的典型應(yīng)用java.awt中的組合模式Java...
    小旋鋒的簡(jiǎn)書(shū)閱讀 1,030評(píng)論 0 4
  • “媽媽”的去世堪澎,牽扯出曾經(jīng)一家五口的過(guò)往。優(yōu)秀的大哥味滞,被寵溺的二哥樱蛤,被忽略的小妹马昙,一生懦弱的老爹,在沒(méi)了“媽媽”的...
    miss馮馮閱讀 484評(píng)論 0 5