组合模式(Composite)
来源:互联网 发布:通达信数据导出 编辑:程序博客网 时间:2024/06/04 01:21
1. 定义
将对象组合成树形结构以表示”部分-整体”的层次结构,Composite模式使得用户对单个对象和组合对象的使用具有一致性。
2. UML建模图
Component(抽象构件接口)
- 为组合的对象声明接口
- 在某些情况下实现从此接口派生出的所有类共有的默认行为
- 定义一个接口可以访问及管理它的多个子部件
Leaf(叶部件)
- 在组合中表示叶节点对象,叶节点没有子节点
- 定义组合中接口对象的行为
Composite(组合类)
- 定义有子节点(子部件)的部件的行为
- 存储子节点(子部件)
- 在Component接口中实现与子部件相关的操作
Client(客户端)
- 通过Component接口控制组合部件的对象
3. 实现代码:
// Component:public abstract class Component { public abstract void doSomething(); public void addChild(Component child){ throw new UnsupportedOperationException("对象不支持这个功能"); } public void removeChild(Component child){ throw new UnsupportedOperationException("对象不支持这个功能"); } public Component getChildren(int index){ throw new UnsupportedOperationException("对象不支持这个功能"); } public List<Component> getAll(){ throw new UnsupportedOperationException("对象不支持这个功能"); }}// Leaf:public class Leaf extends Component { private String name; public Leaf(String name){ this.name = name; } @Override public void doSomething() { System.out.println(name); }}// Composite:public class Composite extends Component { private List<Component> list; //遍历所有元素 @Override public void doSomething() { if(list != null && list.size()!=0){ //如果是Composite对象 会递归 list.forEach(element -> element.doSomething()); }else { System.out.println("元素为空"); } } @Override public void addChild(Component child) { if(list == null){ list = new ArrayList<>(); } list.add(child); } @Override public void removeChild(Component child) { if(list != null){ list.remove(child); } } @Override public Component getChildren(int index) { if(list != null){ if(index >= 0 && index < list.size()){ return list.get(index); } } return null; } @Override public List<Component> getAll() { return this.list; }}//Clientpublic class Client { public static void main(String[] args) { //定义所有的组合对象 Component root = new Composite("服装"); Component c1 = new Composite("男装"); Component c2 = new Composite("女装"); //定义所有的叶子对象 Component leaf1 = new Leaf("衬衣"); Component leaf2 = new Leaf("夹克"); Component leaf3 = new Leaf("裙子"); Component leaf4 = new Leaf("套装"); //按照树的结构来组合组合对象和叶子对象 root.addChild(c1); root.addChild(c2); c1.addChild(leaf1); c1.addChild(leaf2); c2.addChild(leaf3); c2.addChild(leaf4); //调用根对象的输出功能来输出整棵树 root.doSomething(); }}
4. 研磨设计模式
商品的类别树: +服装 +男装 -衬衣 -夹克 +女装 -裙子 -套装
对于这种具有整体与部分的关系,并能组合成树形结构的对象结构,对它们用统一的方式进行操作。—>组合模式
组合模式(Composite)的关键就在于这个父抽象类,这个抽象类既可以代表叶子对象,也可以代表组合对象,这样用户在操作的时候,对单个对象和组合对象的使用就具有一致性。
0 0
- 组合模式(Composite)
- 组合模式(Composite)
- Composite(组合模式)
- 组合(Composite)模式
- 组合模式(Composite)
- composite(组合)模式
- Composite(组合)模式
- 组合模式(Composite)
- 组合(composite)模式
- 组合模式(Composite)
- 组合模式(Composite)
- 组合模式(Composite)
- 组合模式(Composite)
- 组合模式(Composite)
- Composite(组合模式)
- 组合模式(Composite)
- 组合模式(Composite)
- Composite(组合模式)
- Unicode_String Ansi_String 内核字符串操作
- UI控件--上下文Menu
- 258. Add Digits
- Oracle10g以后的语法
- 压缩感知中的数学知识:稀疏、范数、符号arg min
- 组合模式(Composite)
- 分享 原生javaScript实现的楼层导航功能
- 2016 Y Combinator Winter 13家机器学习&数据分析初创公司
- shape的使用(全圆角、部分圆角)
- iOS 企业级开发证书发布权限问题
- XAudio2学习之组合音频方法作为操作集
- 电感的主要参数
- solr学习笔记
- (二)mybatis学习之入门增删改查