先看一下结构图
?
2. 如果把Composite模式看成是树形结构的话,那么它主要角色有:
?
1)抽象构件角色(Component):该角色是一个抽象类,它定义了一些操作增删树叶(Leaf)的操作。
?
2)树枝构件角色(Composite):树枝上有很多树干,树枝也是树干的一种。
?
3)树叶构件角色(Leaf): ?树枝上的树叶,也就是Component中的具体操作对象【注意没有,因为处在最末端?????所有没有add和remove方法】
?3.?组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性【我觉得此处要重点理解,但是,我还没有完全理解】
?
好吧,上代码。
example: 某网刊有体育模块和国内新闻模块,体育模块下有CBA和NBA网站;国内新闻模块有上海地区新闻和江苏地区新闻
?
class="java" name="code">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); } }
?
代码写的比较匆忙,有些地方没有添加注释,抽时间补上吧。
?
?
返回导航