考試臨近,越來越大的焦慮感!.!@今天學習的是組合模式
組合模式(composite pattern)
定義:將物件組合成樹形結構以表示「部分-整體」的層次結構,組合模式使得使用者對單個物件和組合物件的使用具有一致性。
有時候又叫做部分-整體模式,它使我們樹型結構的問題中,模糊了簡單元素和複雜元素的概念,客戶程式可以像處理簡單元素一樣來處理複雜元素,從而使得客戶程式與複雜元素的內部結構解耦。
角色:
component: 是組合中的物件宣告介面,在適當的情況下,實現所有類共有介面的預設行為。宣告乙個介面用於訪問和管理component子部件。
leaf :在組合中表示葉子結點物件,葉子結點沒有子結點。
composite: 定義有枝節點行為,用來儲存子部件,在component介面中實現與子部件有關操作,如增加(add)和刪除(remove)等。
類圖:
例項**(大話設計模式一書中公司管理系統):
abstract class company
public abstract void add(company c);
public abstract void remove(company c);
public abstract void display(int depth);
public abstract void lineofduty();
}class concretecompany : company
public override void add(company c)
public override void remove(company c)
public override void display(int depth)
}public override void lineofduty()}}
class hrdepartment : company
public override void add(company c)
public override void remove(company c)
public override void display(int depth)
public override void lineofduty()
員工招聘培訓管理", name);}}
class financedepartment : company
public override void add(company c)
public override void remove(company c)
public override void display(int depth)
public override void lineofduty()
公司財務收支管理", name);}}
class program
}
優點:
定義了包含基本物件和組合物件的類層次結構 基本物件可以被組合成更複雜的組合物件,而這個組合物件又可以被組合,這樣不斷的遞迴下去。客戶**中,任何用到 基本物件的地方都可以使用組合物件。
簡化客戶** 客戶可以一致地使用組合結構和單個物件。通常使用者不知道 (也不關心)處理的是乙個葉節點還是乙個組合元件。這就簡化了客戶** , 因為在定義組合的那些類中不需要寫一些充斥著選擇語句的函式。
使得更容易增加新型別的元件 新定義的composite或leaf子類自動地與已有的結構和客戶**一起工作,客戶程式不需因新的component類而改變。
使你的設計變得更加一般化 容易增加新元件也會產生一些問題,那就是很難限制組合中的元件。有時你希望乙個組合只能有某些特定的元件。使用composite時,你不能依賴型別系統施加這些約束,而必須在執行時刻進行檢查。
組合數取模
複習了一下組合數取模,當然推薦檢視acdreamer的部落格啦,寫的確實好啦,自己把裡面的題目全a掉了。include include include include include include include using namespace std typedef long long ll l...
組合數取模
對於c n,m mod p。這裡的n,m,p p為素數 都很大的情況。就不能再用c n,m c n 1,m c n 1,m 1 的公式遞推了。這裡用到lusac定理 for non negative integers m and n and a prime p,the following congr...
組合數取模
組合數c m,n 表示在m個不同的元素中取出n個元素 不要求有序 產生的方案數。定義式 c m,n m n m n 並不會使用latex qaq 根據題目中對組合數的需要,有不同的計算方法。運用乙個數學上的組合恒等式 oi中稱之為楊輝三角 c m,n c m 1,n 1 c m 1,n 證明 1.直...