8.设计模式之组合模式
先看一下结构图
2. 如果把Composite模式看成是树形结构的话,那么它主要角色有:
1)抽象构件角色(Component):该角色是一个抽象类,它定义了一些操作增删树叶(Leaf)的操作。
2)树枝构件角色(Composite):树枝上有很多树干,树枝也是树干的一种。
3)树叶构件角色(Leaf): 树枝上的树叶,也就是Component中的具体操作对象【注意没有,因为处在最末端 所有没有add和remove方法】
3. 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性【我觉得此处要重点理解,但是,我还没有完全理解】
好吧,上代码。
example: 某网刊有体育模块和国内新闻模块,体育模块下有CBA和NBA网站;国内新闻模块有上海地区新闻和江苏地区新闻
package designpattern.composite;
/**
*
* 定义一个抽象树干类
*
* @author king
*
*/
public abstract class Component {
public String name;//组件的名字
public Component(String name){
this.name=name;
}
//加入组件
abstract void add(Component component);
//删除组件
abstract void remove(Component component);
//组件方法
abstract void operation(Component component);
}
package designpattern.composite;
import java.util.ArrayList;
import java.util.List;
/**
*
* 树枝角色类
*
* @author king
*
*/
public class Composite extends Component{
private List<Component> components = null;
public Composite(String name) {
super(name);
components = new ArrayList<Component>();
}
void add(Component component) {
components.add(component);
}
void remove(Component component) {
components.remove(component);
}
//就实现一个打印功能
void operation(Component component) {
//枝干节点主要输出自己和自己的子结点
System.out.println(this.name);
//如果存在枝节点,则打印枝节点
for(Component c : components){
//递归输出每个子对象
System.out.print("\t");
c.operation(c);
}
}
}
package designpattern.composite;
/**
*
* 叶子角色类
*
* @author king
*
*/
public class Leaf extends Component {
public Leaf(String name) {
super(name);
}
void add(Component component) {
throw new UnsupportedOperationException("叶子角色类不支持这个功能");
}
void remove(Component component) {
throw new UnsupportedOperationException("叶子角色类不支持这个功能");
}
//就实现一个打印功能
void operation(Component component) {
//叶子结点只要输出自己
System.out.println("\t"+this.name);
}
}
package designpattern.composite;
public class Client {
public static void main(String[] args) {
Component newsRoot = new Composite("新闻");
Component sportsNews = new Composite("体育新闻");
Component nbaNews = new Leaf("NBA");
Component cbaNews = new Leaf("CBA");
Component nationalNews = new Composite("国内新闻");
Component shanghaiNews = new Leaf("上海");
Component jiangsuNews = new Leaf("江苏");
sportsNews.add(nbaNews);
sportsNews.add(cbaNews);
nationalNews.add(shanghaiNews);
nationalNews.add(jiangsuNews);
newsRoot.add(nationalNews);
newsRoot.add(sportsNews);
newsRoot.operation(newsRoot);
}
}
代码写的比较匆忙,有些地方没有添加注释,抽时间补上吧。
设计模式,任重道远啊。