合成模式定义
合成模式,也叫树形模式,就是把部分和整体的关系通过树形结构来表示,使得客户端对单个对象和组合对象的使用具有一致性
合成模式也是继承的另一种替代方法
合成模式组成结构
合成模式主要由三个部分组成:抽象类、叶子类和父类
1.抽象类:这是一个抽象角色,它给参加组合的对象定义出公共的接口以及默认的行为,组合对象的名义父类可以通过它来管理所有的子对象,而不需要通过继承
2.叶子类:名义上的子类,通过实现接口,定义出参加组合的原始对象的行为
3.父类:名义上的父类,通过实现接口的方法进行行为组合,通常在该类中定义一个私有的叶子类成员集合(通常为List或者数组等),主要用于实现父类原始对象行为和叶子类原始对象行为合成
合成模式使用场景
在进行电脑的复制操作时,我们复制文件,使用ctrl+c组合键,然后到目的目录下使用ctrl+v组合键就可以将文件复制到指定文件中。在复制文件夹时,同样使用ctrl+c和ctrl+v进行复制,而不需要将文件夹中的文件一个个的进行复制,即,对于用户而言,不管是文件还是文件夹的复制,操作方式都是一样的,这就是合成模式的典型应用
非合成模式实现:文件(夹)复制
首先创建文件夹类:
public class Folder{
private String name;
private List<Folder> list = new ArrayList<Folder>();
public Folder(){
}
public Folder(String name){
this.name = name;
}
public void add(Folder folder){
list.add(folder);
}
public void remove(Folder folder){
list.remove(folder);
}
public String getName(){
return this.name;
}
public void copy(){
System.out.println("进行文件夹的复制:"+this.getName());
for(int i=0; i<list.size(); i++){
Folder folder = list.get(i);
folder.copy();
}
}
}
定义文件,扩展文件夹:
public class File1 extends Folder{
private String name;
public File1(String name){
this.name = name;
}
public String getName(){
return this.name;
}
@Override
public void copy(){
System.out.println("正在复制文件:"+this.getName());
}
}
public class File2 extends Folder{
private String name;
public File2(String name){
this.name = name;
}
public String getName(){
return this.name;
}
@Override
public void copy(){
System.out.println("正在复制文件:"+this.getName());
}
}
最后在客户端进行赋值文件和文件夹测试:
public class Client{
public static void main(String[] args){
Folder folder1 = new Folder("文件夹1");
Folder folder2 = new Folder("文件夹2");
File file1 = new File("文件1");
File file2 = new File("文件2");
File file3 = new File("文件3");
folder1.add(file1);
folder2.add(file2);
folder2.add(file3);
folder1.copy();
folder2.copy();
}
}
输出结果可以看到文件和文件夹都能成功复制
合成模式实现:文件(夹)的复制
首先定义一个接口:
public interface Component{
p
pubic void copy();
}
分别定义文件和文件夹实现该接口并实现copy方法:
class Folder implements Component{
private String name;
private List<Component> lists = new ArrayList<Component>();
public Folder(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void add(Component com){
lists.add(com);
}
public void remove(Component com){
lists.remove(com);
}
public void copy(){
System.out.println("文件夹复制中:"+this.getName());
for(int i=0; i<lists.size(); i++){
Component com = lists.get(i);
com.copy();
}
}
}
class File1 implements Component{
private String name;
public File1(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void copy(){
System.out.println("\t正在复制文件:"+this.getName());
}
}
class File2 implements Component{
private String name;
public File2(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void copy(){
System.out.println("\t正在复制文件:"+this.getName());
}
}
客户端测试代码:
public class CompositeMain {
public static void main(String[] args){
Folder folder1 = new Folder("文件夹1");
Folder folder2 = new Folder("文件夹2");
Component file1 = new File1("文件1");
Component file2 = new File2("文件2");
folder1.add(file1);
folder2.add(file2);
folder1.copy();
folder2.copy();
}
}
我们可以看到,同样实现了文件和文件夹的复制,并且文件和文件夹之间并没有继承关系,从而减少了类之间的耦合
合成模式应用
合成模式在程序设计中有着广泛的应用,比如Dom4j、资源管理器、Java GUI容器层次图等等都是合成模式应用的典范。