组合模式-实现文件夹浏览
用透明组合模式实现教材中的“文件夹浏览”这个例子。

java代码
AbstractFile
public abstract class AbstractFile { public abstract void add(AbstractFile ele); public abstract void remove(AbstractFile ele); public abstract void display(); }
Folder
import java.util.ArrayList; public class Folder extends AbstractFile{ private String filename; private ArrayList al=new ArrayList<>(); public Folder(String f) { filename=f; } @Override public void add(AbstractFile ele) { // TODO Auto-generated method stub al.add(ele); System.out.println("Folder add"); } @Override public void remove(AbstractFile ele) { // TODO Auto-generated method stub al.remove(ele); System.out.println("Folder remove"); } @Override public void display() { // TODO Auto-generated method stub for(Object object:al) { ((AbstractFile)object).display(); } System.out.println("Folder:display"); } }
ImageFile
public class ImageFile extends AbstractFile{ private String filename; public ImageFile(String f) { filename=f; } @Override public void add(AbstractFile ele) { // TODO Auto-generated method stub System.out.println("添加Image文件"); } @Override public void remove(AbstractFile ele) { // TODO Auto-generated method stub System.out.println("删除Image文件"); } @Override public void display() { // TODO Auto-generated method stub System.out.println("展示Image文件"+filename); } }
TextFile
public class TextFile extends AbstractFile{ private String filename; public TextFile(String f) { filename=f; } @Override public void add(AbstractFile ele) { // TODO Auto-generated method stub System.out.println("添加Text文件"); } @Override public void remove(AbstractFile ele) { // TODO Auto-generated method stub System.out.println("删除Text文件"); } @Override public void display() { // TODO Auto-generated method stub System.out.println("展示Text文件"+filename); } }
VideoFile
public class VideoFile extends AbstractFile{ private String filename; public VideoFile(String f) { filename=f; } @Override public void add(AbstractFile ele) { // TODO Auto-generated method stub System.out.println("添加Video文件"); } @Override public void remove(AbstractFile ele) { // TODO Auto-generated method stub System.out.println("删除Video文件"); } @Override public void display() { // TODO Auto-generated method stub System.out.println("展示Video文件"+filename); } }
Cient
public class Client { public static void main(String a[]) { AbstractFile obj1,obj2,obj3,obj4,obj5; Folder plate1,plate2,plate3; obj1=new ImageFile("aaa.png"); obj2=new TextFile("bbb.txt"); plate1=new Folder("ccc"); plate1.add(obj1); plate1.add(obj2); obj3=new VideoFile("ddd.mp3"); obj4=new VideoFile("eee.mp3"); plate2=new Folder("fff"); plate2.add(obj3); plate2.add(obj4); obj5=new ImageFile("ggg.jpg"); plate3=new Folder("hhh"); plate3.add(plate1); plate3.add(plate2); plate3.add(obj5); plate3.display(); } }
c++代码
#include<iostream> #include<string> #include<vector> using namespace std; class AbstractFile { public: virtual void add(AbstractFile *ele)=0; virtual void remove(AbstractFile *ele)=0; virtual void display()=0; }; class TextFile :public AbstractFile{ private: string filename; public: TextFile(string f) { filename = f; } void add(AbstractFile *ele) { // TODO Auto-generated method stub cout<<"添加Text文件"<<endl; } void remove(AbstractFile *ele) { // TODO Auto-generated method stub cout<<"删除Text文件"<<endl; } void display() { // TODO Auto-generated method stub cout<<"展示Text文件"<< filename<<endl; } }; class ImageFile :public AbstractFile{ private: string filename; public: ImageFile(string f) { filename = f; } void add(AbstractFile *ele) { // TODO Auto-generated method stub cout << "添加Image文件" << endl; } void remove(AbstractFile *ele) { // TODO Auto-generated method stub cout << "删除Image文件" << endl; } void display() { // TODO Auto-generated method stub cout << "展示Image文件" << filename << endl; } }; class VideoFile :public AbstractFile{ private: string filename; public: VideoFile(string f) { filename = f; } void add(AbstractFile *ele) { // TODO Auto-generated method stub cout << "添加Video文件" << endl; } void remove(AbstractFile *ele) { // TODO Auto-generated method stub cout << "删除Video文件" << endl; } void display() { // TODO Auto-generated method stub cout << "展示Video文件" << filename << endl; } }; class Folder:public AbstractFile{ private: string filename; private:vector<AbstractFile* > va; public: Folder(string f) { filename = f; } void add(AbstractFile *ele) { // TODO Auto-generated method stub va.push_back(ele); cout<<"Folder add"<<endl; } void remove(AbstractFile *ele) { // TODO Auto-generated method stub vector<AbstractFile* >::iterator it; it = find(va.begin(), va.end(), ele); for (it != va.end();;){ va.erase(it); } cout<<"Folder remove"<<endl; } void display() { // TODO Auto-generated method stub for (vector<AbstractFile*>::const_iterator iter = va.begin(); iter != va.cend(); iter++) { (*iter)->display(); } cout<<"Folder:display"<<endl; } }; int main(){ AbstractFile *obj1, *obj2, *obj3, *obj4, *obj5; Folder *plate1, *plate2, *plate3; obj1 = new ImageFile("aaa.png"); obj2 = new TextFile("bbb.txt"); plate1 = new Folder("ccc"); plate1->add(obj1); plate1->add(obj2); obj3 = new VideoFile("ddd.mp3"); obj4 = new VideoFile("eee.mp3"); plate2 = new Folder("fff"); plate2->add(obj3); plate2->add(obj4); obj5 = new ImageFile("ggg.jpg"); plate3 = new Folder("hhh"); plate3->add(plate1); plate3->add(plate2); plate3->add(obj5); plate3->display(); }

浙公网安备 33010602011771号