GoF——组合模式
2016-04-07 15:04
555 查看
组合模式:将对象组合成树形结构以表示“部分-真题”的结构层次。组合模式使得用户对单个对象和组合对象的使用具有一致性。
结构图:
Composite
当你发现需求中是体现部分与整体的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的多有对象时,就应该考虑用组合模式。
结构图:
using System; using System.Collections.Generic; using System.Text; namespace 组合模式 { class Program { static void Main(string[] args) { Composite root = new Composite("root"); root.Add(new Leaf("Leaf A")); root.Add(new Leaf("Leaf B")); Composite comp = new Composite("Composite X"); comp.Add(new Leaf("Leaf XA")); comp.Add(new Leaf("Leaf XB")); root.Add(comp); Composite comp2 = new Composite("Composite XY"); comp2.Add(new Leaf("Leaf XYA")); comp2.Add(new Leaf("Leaf XYB")); comp.Add(comp2); root.Add(new Leaf("Leaf C")); Leaf leaf = new Leaf("Leaf D"); root.Add(leaf); root.Remove(leaf); root.Display(1); Console.Read(); } } abstract class Component { protected string name; public Component(string name) { this.name = name; } public abstract void Add(Component c); public abstract void Remove(Component c); public abstract void Display(int depth); } class Composite : Component { private List<Component> children = new List<Component>(); public Composite(string name) : base(name) { } public override void Add(Component c) { children.Add(c); } public override void Remove(Component c) { children.Remove(c); } public override void Display(int depth) { Console.WriteLine(new String('-', depth) + name); foreach (Component component in children) { component.Display(depth + 2); } } } class Leaf : Component { public Leaf(string name) : base(name) { } public override void Add(Component c) { Console.WriteLine("Cannot add to a leaf"); } public override void Remove(Component c) { Console.WriteLine("Cannot remove from a leaf"); } public override void Display(int depth) { Console.WriteLine(new String('-', depth) + name); } } }
Composite
当你发现需求中是体现部分与整体的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的多有对象时,就应该考虑用组合模式。
相关文章推荐
- hdu 1533 Going Home (zkw + spfa和slf优化)
- 全局偏移表(GOT)和过程链接表(PLT)
- django入门记录 2
- golang利用组合实现继承
- GoogleTest Primer
- go语言的中“继承”
- Golang之继承模拟
- ubuntu14.04如何使用google search
- light OJ1259 - Goldbach`s Conjecture
- django manage.py Unknown command: 'runfcgi'
- hdu 1533 Going Home(zkw费用流)
- (Algorithm)不相交集(Disjoint-set)
- What are some good libraries for dynamic Bayesian networks
- go项目-解决端口占用问题
- Django1.6 用Form实现注册登录注销修改密码
- Django1.6 用Form实现注册登录注销修改密码
- Django REST framework 的快速入门教程
- Go by Example
- 快速排序算法 原理及golang语言实现
- 设计模式-装饰者模式(Go语言描述)