设计模式——组合模式
来源:互联网 发布:淘宝产品详情图片制作 编辑:程序博客网 时间:2024/05/19 23:13
个人理解;
1. 组合模式:将对象组合成树形结构以表示“部分—整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。它将对象组织到树结构中,可以用来描述整体与部分的关系。同时它也模糊了简单元素(叶子对象)和复杂元素(容器对象)的概念,使得客户能够像处理简单元素一样来处理复杂元素,从而使客户程序能够与复杂元素的内部结构解耦。
2. 在Android开发中用到组合模式并不很多,组合模式更多的用于界面UI的架构设计上,而这部分让开发者去实现的并不多。组合模式在Android 中应用举例:文件系统:Dir File 等,操作控件:View、ViewGroup等
3. 组合模式有透明模式、安全模式两种,区分在于叶子节点有没有开放add、remove操作
4. 组合模式优点:
- 可以清楚定义分层次的复杂对象,表示全部或部分层次,让高层忽略层次的差异,方便对整个层次结构进行控制。
- 高层模块可以一致的使用一个组合结构或其中的单个对象,不必挂心处理的是单个对象还是整个组合结构,简化了高层模块的代码。
- 增加新的枝干和叶子构件都很方便,无需对现有类进行任何修改,就像增加一个自定义View一样。
- 将对象之间的关系形成树形结构,便于控制。
5. 组合模式UML图:
6. 示例代码:
Component:
public abstract class Component { protected String name; public Component(String name) { this.name = name; } public abstract void add(Component component); public abstract void remove(Component component); public abstract void clear(); public abstract Component getComponent(int position); public abstract void doSomething();}
Composite:
public class Branches extends Component { private List<Component> components = new ArrayList<>(); public Branches(String name) { super(name); } @Override public void add(Component component) { components.add(component); } @Override public void remove(Component component) { if (components.contains(component)){ components.remove(component); } } @Override public void clear() { if (components.size() > 0){ components.clear(); } } @Override public Component getComponent(int position) { if (components.size() > position){ return components.get(position); } return null; } @Override public void doSomething() { Log.i(name, "----------------" + name + "-----------------"); if (components.size() > 0){ for (Component component : components){ component.doSomething(); } } else { Log.i(name, "----------------" + name+ "没有子节点-----------------"); } }}
Leaf:
public class Leaf extends Component { public Leaf(String name) { super(name); } @Override public void add(Component component) { Log.i(name, "----------------" + name+ "没有子节点-----------------"); } @Override public void remove(Component component) { Log.i(name, "----------------" + name+ "没有子节点-----------------"); } @Override public void clear() { Log.i(name, "----------------" + name+ "没有子节点-----------------"); } @Override public Component getComponent(int position) { Log.i(name, "----------------" + name+ "没有子节点-----------------"); return null; } @Override public void doSomething() { Log.i("Leaf" ,"----------------Leaf:" + name + "----------------"); }}
客户端调用:
private void factoryGroup(){ Component root = new Branches("根节点——学校"); Component grade1 = new Branches("枝节点——高一年级"); Component grade2 = new Branches("枝节点——高二年级"); Component grade3 = new Branches("枝节点——高三年级"); Component class1 = new Leaf("叶子点——第一班"); Component class2 = new Leaf("叶子点——第二班"); Component class3 = new Leaf("叶子点——第三班"); Log.i("factoryGroup", "****************第一次遍历****************"); root.doSomething(); grade1.add(class1); grade1.add(class2); grade1.add(class3); root.add(grade1); Log.i("factoryGroup", "****************第二次遍历****************"); root.doSomething(); grade2.add(class1); grade2.add(class2); grade2.add(class3); grade3.add(class1); grade3.add(class2); grade3.add(class3); root.add(grade2); root.add(grade3); Log.i("factoryGroup", "****************第三次遍历****************"); root.doSomething(); root.getComponent(1).remove(class3); root.getComponent(1).remove(class2); Log.i("factoryGroup", "****************第四次遍历****************"); root.doSomething(); root.getComponent(2).clear(); Log.i("factoryGroup", "****************第五次遍历****************"); root.doSomething();}
调用结果:太多了,略
阅读全文
0 0
- 设计模式—组合模式
- 设计模式—组合模式
- 设计模式——组合设计模式
- 设计模式组合——命令模式组合工厂模式
- 每日设计模式——组合模式
- 设计模式——组合模式
- Java设计模式——组合模式
- java设计模式——组合模式
- 设计模式——组合模式
- 设计模式——组合模式
- 设计模式——组合模式
- 设计模式——组合模式
- Python设计模式——组合模式
- 设计模式8——组合模式
- C++设计模式——组合模式
- 设计模式——组合模式
- C++设计模式——组合模式
- 设计模式——组合模式
- Eclipse中项目引用关联项目方法及注意事项
- MySQL服务安装步骤
- java使用MongoDB更新实体类某一字段的值
- 蓝桥杯 算法提高 P0102(Java解题)
- Capstone日志2017-12-12
- 设计模式——组合模式
- C++ const用法总结
- pkg-config一些用法
- Ubuntu SS 搭建 ShdowSocks
- 猜数字
- expdp 一例: ORA-39095: Dump file space has been exhausted
- 焦点抢占
- JavaScript代码规范
- 迅雷5.8稳定版工具