组合模式

来源:互联网 发布:马斯达城 知乎 编辑:程序博客网 时间:2024/05/17 06:54

应用场景:

通过实现组合模式,调用者对组合对象的操作与对单一对象的操作具有一致性。调用者不用关心这是组合对象还是文件,也不用关心组合对象内部的具体结构,就可以调用相关方法,实现功能。 

这里对windows中的文件和文件夹的操作来说明,我们可以看到我们自己对文件和文件夹都有重名名,复制,粘贴,剪切等功能,我们不会去关心它是文件还是文件夹。直接无脑复制粘贴即可。


定义文件或文件夹共有的操作

/**
 * 定义树形结构中每个节点共有的操作
 * @author Administrator
 *
 */
public interface Operation {
//复制
public void copy();
//粘贴
public void paste();
}

------------------------------------------------

/**
 * 文件,相当于树形结构中的叶,它的下面没有子节点
 * @author Administrator
 *
 */
public class File implements Operation{


@Override
public void copy() {
System.out.println("---复制文件"+fileName);
}


@Override
public void paste() {
System.out.println("---粘贴文件"+fileName);
}

private String fileName;


public File(String fileName) {
super();
this.fileName = fileName;
}
}

-----------------------------------------------------------------

/**
 * 文件夹,作为组合模式中的树型结构中的根
 * @author Administrator
 *
 */
public class Folder implements Operation {

private List<Operation> list = new ArrayList<Operation>();

//addOperation以此来建立树形结构
public void addOperation(Operation operation){
list.add(operation);
}

@Override
public void copy() {
System.out.println("---复制文件夹"+folderName);

if(list.size()==0)
return;

//遍历此文件夹下的所有文件或文件夹
for (Operation operation : list) {
operation.copy();
}
}


@Override
public void paste() {
System.out.println("---粘贴文件夹"+folderName);

if(list.size()==0)
return;

//遍历此文件夹下的所有文件或文件夹
for (Operation operation : list) {
operation.paste();
}
}

public String folderName;


public Folder(String folderName) {
super();
this.folderName = folderName;
}
}

----------------------------------------------------------------

/**
 * 测试类
 * @author Administrator
 *
 */
public class Test {


/**
* @param args
*/
public static void main(String[] args) {
Folder folderMusic = new Folder("音乐文件夹");

Folder folderMusic_2 = new Folder("张信哲专辑文件夹");

File fileMusic1 = new File("大海.mp3");
File fileMusic2 = new File("新贵妃醉酒.mp3");
File fileMusic3 = new File("没那么简单.mp3");

File fileMusic4 = new File("过火.mp3");
File fileMusic5 = new File("从开始到现在.mp3");
File fileMusic6 = new File("别怕我伤心.mp3");
/**----------------------------------------------**/

//建立树形结构,形成组合模式
folderMusic.addOperation(folderMusic_2);
folderMusic_2.addOperation(fileMusic4);
folderMusic_2.addOperation(fileMusic5);
folderMusic_2.addOperation(fileMusic6);

folderMusic.addOperation(fileMusic1);
folderMusic.addOperation(fileMusic2);
folderMusic.addOperation(fileMusic3);
/**----------------------------------------------**/
//对组合中的对象进行复制和粘贴操作
folderMusic.copy();
System.out.println(">>>>>>>>");
folderMusic.paste();
}
}


Result:

---复制文件夹音乐文件夹
---复制文件夹张信哲专辑文件夹
---复制文件过火.mp3
---复制文件从开始到现在.mp3
---复制文件别怕我伤心.mp3
---复制文件大海.mp3
---复制文件新贵妃醉酒.mp3
---复制文件没那么简单.mp3
>>>>>>>>
---粘贴文件夹音乐文件夹
---粘贴文件夹张信哲专辑文件夹
---粘贴文件过火.mp3
---粘贴文件从开始到现在.mp3
---粘贴文件别怕我伤心.mp3
---粘贴文件大海.mp3
---粘贴文件新贵妃醉酒.mp3
---粘贴文件没那么简单.mp3



0 0