组合模式--统一区别,同样对待(结构型模式02)
来源:互联网 发布:java jar 运行参数 编辑:程序博客网 时间:2024/06/05 06:36
什么是组合模式
将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象以及组合对象的适用具有一致性。
组合模式又称为部分整体模式,他主要是根据一个树状结构来确定要归纳为同一类的对象,从而以同样的方法去访问对象和对象组合,忽略掉他们之间的差别。比如根文件下有文件和子文件夹,子文件夹下还会有文件和子文件夹……这个如果我们要写一个类来层次描述他们,岂不是要写很多很多。使用组合模式就是把文件和文件夹不加以区别,统称为文件对象。
组合模式的适用场景
表示“部分-整体”的层次结构时
一个整体中可以独立出部分模块和功能的场景
组合模式用例
文件夹下可以存放文件夹和文件,这个子文件夹下还可以存放文件和文件夹….我们现在要做的就是获得这个文件系统的结构图。
UML类图
AbstractFile抽象类
public abstract class AbstractFile { protected List<AbstractFile> afs = new ArrayList<>(); protected String mName; public AbstractFile(String name){ mName = name; } public abstract void mAdd(AbstractFile af); public abstract void mRemove(AbstractFile af); public abstract void printName();}
Files类
public class Files extends AbstractFile { public Files(String name) { super(name); // TODO Auto-generated constructor stub } @Override public void mAdd(AbstractFile af) { // TODO Auto-generated method stub } @Override public void mRemove(AbstractFile af) { // TODO Auto-generated method stub } @Override public void printName() { System.out.println("....."+mName); }}
Folders类
public class Folders extends AbstractFile { public Folders(String name) { super(name); } @Override public void mAdd(AbstractFile af) { afs.add(af); } @Override public void mRemove(AbstractFile af) { afs.remove(af); } @Override public void printName() { System.out.println(mName); for(AbstractFile f : afs){ f.printName(); } }}
主类调用
public class Test { public static void main(String[] args) { AbstractFile apk = new Files("1.apk"); AbstractFile text = new Files("1.txt"); AbstractFile png = new Files("1.png"); AbstractFile folder1 = new Folders("folder1"); folder1.mAdd(text); folder1.mAdd(png); folder1.mAdd(apk); AbstractFile jpg = new Files("1.jsp"); AbstractFile exe = new Files("1.exe"); AbstractFile folder2 = new Folders("folder2"); folder2.mAdd(jpg); folder2.mAdd(exe); AbstractFile folder = new Folders("Folder"); folder.mAdd(folder1); folder.mAdd(folder2); folder.printName(); }}
运行结果:
Folderfolder1.....1.txt.....1.png.....1.apkfolder2.....1.jsp.....1.exe
总结:
经过分析以上代码,我们明白了组合就是同一对象操作,通过递归来遍历对象树,从而达到我们的目的。
优点是简化了操作,清楚了分层,方便对整个层次结构的控制。添加树子叶方便,符合开闭原则。
缺点是违背了单一职责原则,而且通过继承实现,代码的灵活性降低。而且新增构件又会复杂一点,比如要在文件操作中增加mClear()操作,又要去修改抽象类以及实现。
0 0
- 组合模式--统一区别,同样对待(结构型模式02)
- 组合模式(结构型)
- 结构型模式-----组合模式(Composite)
- (结构型模式六)组合模式
- Composite模式(组合模式 结构型)
- 组合模式(结构型设计模式)
- 结构型模式-组合模式
- 结构型模式--组合模式
- 结构型模式-组合模式
- 结构型-组合模式
- 结构型模式-组合
- 结构型--组合模式
- 组合模式(结构型)
- 设计模式 - 结构型模式 - 组合模式
- 组合模式--部分整体一致对待
- 组合模式 - 结构模式
- 结构模式->组合模式
- Composite 组合(结构型模式)
- 13种UML简介、工具及示例
- MAT函数
- opencv函数源码之直方图规定化(2)
- 41. First Missing Positive
- 算法--冒泡排序-Java实现
- 组合模式--统一区别,同样对待(结构型模式02)
- [BZOJ4373][线段树]算术天才⑨与等差数列
- 简单实现两个listView的联动效果(网络框架Retrofit+Rxjava)
- BZOJ P3437 小P的牧场
- 人工智能终究会抢了我们程序员的饭碗
- Liunx 上面使用Python连接Redis遇到的一些问题
- 集合类2-TreeSet
- Windows BAT脚本中调用BAT脚本导致CMD退出的问题
- 1333: Funny Car Racing(最短路用spfa)