设计模式学习笔记之组合模式
2014-07-26 22:49
411 查看
定义:将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
组合模式让我们用树形方式创建对象的结构,树里面包含了组合以及个别的对象。
使用组合机构,我们能把相同的操作应用在组合和个别对象上。换句话说,在大多数情况下,我们可以忽略对象组合和个别对象之间的区别。
要点:
组合模式提供一个结构,可同时包容个别对象和组合对象。
组合模式允许客户对个别对象以及组合对象一视同仁。
组合结构内的任意对象称为组件,组件可以是组合也可以是叶节点。
在实现组合模式时,有许多设计折衷。你要根据需要平衡透明性和安全性。
结构图:
如图所示:一个Composite实例可以像一个简单的Leaf实例一样,可以把它传递给任何使用Component的方法或者对象,并且它表现的就像是一个Leaf一样。
实例:
// 菜单接口
public interface IMenu {
// 取得名称
public String getName();
// 显示
public void display();
// 添加菜单
public void addItem(IMenu menu);
// 取得所有子菜单
public Iterator getChildren();
}
// 菜单 ,这里相当于一个非叶子节点
public class Menu implements IMenu {
private List<IMenu> items = new ArrayList<IMenu>();
private String name;
public Menu(String name) {
this.name = name;
}
public void addItem(IMenu menu) {
items.add(menu);
}
public void display() {
System.out.println(this.name + ":Menu");
Iterator children = this.getChildren();
while (children.hasNext()) {
IMenu menu = (IMenu) children.next();
menu.display();
}
}
public Iterator getChildren() {
return new ListIterator(items);
}
public String getName() {
return this.name;
}
}
// 菜单项 ,这里相当于叶节点
public class MenuItem implements IMenu {
private String name;
public MenuItem(String name) {
this.name = name;
}
public void display() {
System.out.println(this.name + ":MenuItem");
}
public String getName() {
return this.name;
}
public void addItem(IMenu menu) {
throw new UnsupportedOperationException();
}
public Iterator getChildren() {
return new NullIterator();
}
}
// 菜单条,这里相当于根节点
public class MenuBar {
private List<IMenu> menus = new ArrayList<IMenu>();
public void addMenu(IMenu menu) {
this.menus.add(menu);
}
public void display() {
System.out.println(":MenuBar");
Iterator items = new ListIterator(menus);
while (items.hasNext()) {
IMenu menu = (IMenu) items.next();
menu.display();
}
}
}
// 空迭代器
public class NullIterator implements Iterator {
public boolean hasNext() {
return false;
}
public Object next() {
return null;
}
}
组合模式让我们用树形方式创建对象的结构,树里面包含了组合以及个别的对象。
使用组合机构,我们能把相同的操作应用在组合和个别对象上。换句话说,在大多数情况下,我们可以忽略对象组合和个别对象之间的区别。
要点:
组合模式提供一个结构,可同时包容个别对象和组合对象。
组合模式允许客户对个别对象以及组合对象一视同仁。
组合结构内的任意对象称为组件,组件可以是组合也可以是叶节点。
在实现组合模式时,有许多设计折衷。你要根据需要平衡透明性和安全性。
结构图:
如图所示:一个Composite实例可以像一个简单的Leaf实例一样,可以把它传递给任何使用Component的方法或者对象,并且它表现的就像是一个Leaf一样。
实例:
// 菜单接口
public interface IMenu {
// 取得名称
public String getName();
// 显示
public void display();
// 添加菜单
public void addItem(IMenu menu);
// 取得所有子菜单
public Iterator getChildren();
}
// 菜单 ,这里相当于一个非叶子节点
public class Menu implements IMenu {
private List<IMenu> items = new ArrayList<IMenu>();
private String name;
public Menu(String name) {
this.name = name;
}
public void addItem(IMenu menu) {
items.add(menu);
}
public void display() {
System.out.println(this.name + ":Menu");
Iterator children = this.getChildren();
while (children.hasNext()) {
IMenu menu = (IMenu) children.next();
menu.display();
}
}
public Iterator getChildren() {
return new ListIterator(items);
}
public String getName() {
return this.name;
}
}
// 菜单项 ,这里相当于叶节点
public class MenuItem implements IMenu {
private String name;
public MenuItem(String name) {
this.name = name;
}
public void display() {
System.out.println(this.name + ":MenuItem");
}
public String getName() {
return this.name;
}
public void addItem(IMenu menu) {
throw new UnsupportedOperationException();
}
public Iterator getChildren() {
return new NullIterator();
}
}
// 菜单条,这里相当于根节点
public class MenuBar {
private List<IMenu> menus = new ArrayList<IMenu>();
public void addMenu(IMenu menu) {
this.menus.add(menu);
}
public void display() {
System.out.println(":MenuBar");
Iterator items = new ListIterator(menus);
while (items.hasNext()) {
IMenu menu = (IMenu) items.next();
menu.display();
}
}
}
// 空迭代器
public class NullIterator implements Iterator {
public boolean hasNext() {
return false;
}
public Object next() {
return null;
}
}
相关文章推荐
- 设计模式学习笔记-组合模式
- java 设计模式学习笔记八 composite组合模式
- 设计模式之禅学习笔记--组合模式
- 设计模式学习笔记十七:组合模式(Composite Pattern)
- 设计模式学习笔记-组合模式
- 步步为营 .NET 设计模式学习笔记 十五、Composite(组合模式)
- 《Head First 设计模式》学习笔记:迭代器模式与组合模式
- 设计模式学习笔记——组合模式
- 设计模式学习笔记Composite组合模式
- 设计模式学习笔记之组合模式模式
- 设计模式学习笔记:组合模式
- C#面向对象设计模式学习笔记(8) - Composite 组合模式(结构型模式)
- 设计模式学习笔记之组合模式
- android设计模式学习笔记02--组合模式
- java 设计模式 学习笔记(15) 组合模式
- 设计模式学习笔记——组合模式
- 设计模式学习笔记-组合模式(转载)
- 设计模式学习笔记(组合模式)
- 设计模式学习笔记二十四:优雅的菜单 - 组合模式
- 【设计模式学习笔记九】【结构型模式】【组合模式(Composite)】