设计模式-组合模式
(1)案例背景:
在操作系统中,一个文件夹中可能存放着图像文件,视频文件,文本文件,也可能存放其他的文件夹,而对不同类型的文件进行的浏览操作也不一样,使用透明组合模式,绘制类图并编程实现文件的浏览(课本197页第二题)。
(2)实现步骤:
- 根据题意,画出组合模式的类图,类图中应包含抽象文件类AbstractFile,具体的图像文件类ImageFile,视频文件类VideoFile,文本文件类TextFile以及文件夹类Folder,对每个文件都有display()方法,而对文件夹可以进行add()方法和remove()方法。
- 根据类图,实现上述类的具体代码以及用户类Client,在用户类中需要将不同类型的文件放入文件夹中。
- 编译并运行程序,使程序能够输出对文件的浏览过程。
(3)案例总结:
在以下情况可以使用组合模式:
- 在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,使客户端可以一致的对待他们
- 在使用面向对象语言开发的系统中需要处理一个树形结构
- 在一个系统中能够分离出叶子对象和容器对象,而且他们的类型不固定,需要增加一些新的类型
代码结构:
详细代码:
AbstractFile.java:
package File.AbstractFile; public abstract class AbstractFile { public abstract void display(); }
ImageFile.java:
package File.ConcreteFlie; import File.AbstractFile.AbstractFile; public class ImageFile extends AbstractFile { public void display(){ System.out.println("浏览图片文件。"); } }
TextFile.java:
package File.ConcreteFlie; import File.AbstractFile.AbstractFile; public class TextFile extends AbstractFile { public void display(){ System.out.println("浏览文本文件。"); } }
VideoFile.java:
package File.ConcreteFlie; import File.AbstractFile.AbstractFile; public class VideoFile extends AbstractFile { public void display(){ System.out.println("浏览视频文件。"); } }
Folder.java:
package File.ConcreteFlie; import File.AbstractFile.AbstractFile; import java.util.ArrayList; public class Folder extends AbstractFile { private ArrayList arrayList = new ArrayList(); public void add(AbstractFile abstractFile){ arrayList.add(abstractFile); } public void remove(AbstractFile abstractFile){ arrayList.remove(abstractFile); } public void display(){ for (Object object:arrayList){ ((AbstractFile) object).display(); } } }
Client.java:
package File.Client; import File.AbstractFile.AbstractFile; import File.ConcreteFlie.Folder; import File.ConcreteFlie.ImageFile; import File.ConcreteFlie.TextFile; import File.ConcreteFlie.VideoFile; public class Client { public static void main(String[] args) { System.out.println("详细设计实验报告 1904班白旭君 2019005368"); AbstractFile obj1,obj2,obj3,obj4,obj5,obj6; Folder f1,f2,f3; obj1 = new ImageFile(); obj2 = new TextFile(); obj3 = new VideoFile(); f1 = new Folder(); f1.add(obj1); f1.add(obj2); f1.add(obj3); obj4 = new ImageFile(); obj5 = new ImageFile(); f2 = new Folder(); f2.add(obj4); f2.add(obj5); obj6 = new VideoFile(); f3 = new Folder(); f3.add(f1); f3.add(f2); f3.add(obj6); f3.display(); } }
实验结果: