컴포지트 패턴을 보니 문득 파일 시스템과 유사하게 느껴져
폴더를 하나 지정해, 그 폴더를 포함한 하위 요소를 간이 컴포지트 패턴 틀에 옮겨봤다.
package designpattern.structural.composite;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class 폴더파일 {
static int cnt = 0;
//component
abstract static class FolderOrFile{
private String name;
private boolean isFolder;
protected FolderOrFile(String name, boolean isFolder) {
this.name = name;
this.isFolder = isFolder;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isFolder() {
return isFolder;
}
public void setFolder(boolean isFolder) {
this.isFolder = isFolder;
}
public void add(FolderOrFile folderOrFile) {
throw new UnsupportedOperationException();
}
public void remove(FolderOrFile folderOrFile) {
throw new UnsupportedOperationException();
}
public void print() {
throw new UnsupportedOperationException();
}
}
//composite
static class MyFolder extends FolderOrFile{
List<FolderOrFile> folderOrFiles = new ArrayList<>();
@Override
public void add(FolderOrFile folderOrFile) {
this.folderOrFiles.add(folderOrFile);
}
public MyFolder(String name, boolean isFolder) {
super(name, isFolder);
}
@Override
public void print() {
for(FolderOrFile fof : folderOrFiles) {
System.out.println(cnt+++" "+fof);
}
}
@Override
public String toString() {
return "[Folder]"+getName();
}
}
//leaf
static class MyFile extends FolderOrFile{
private String description;
public MyFile(String name, boolean isFolder, String description) {
super(name, isFolder);
this.description = description;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public void print() {
System.out.println(cnt+++" "+this);
}
@Override
public String toString() {
return "[File]"+getName()+" "+getDescription();
}
}
public static void main(String[] args) {
File file = new File("c:/git");
FolderOrFile fof = new MyFolder(file.getName(), true);
copy(file, fof);
fof.print();
}
static void copy(File file, FolderOrFile folderOrFile) {
if(file.isDirectory()) {
folderOrFile.add(new MyFolder(file.getName(), true));
for(File f : file.listFiles()) {
copy(f , folderOrFile);
}
}else {
folderOrFile.add(new MyFile(file.getName(), false, file.length()+"바이트" ));
}
}
}
824 [File]9de29bb2d1d6434b8b29ae775ad8c2e48c5391 15바이트
825 [Folder]ef
826 [File]7795d074c4633075a0a241bc9f86a4b402d584 145바이트
827 [Folder]info
828 [Folder]pack
829 [File]ORIG_HEAD 41바이트
830 [Folder]refs
831 [Folder]heads
832 [File]master 41바이트
833 [Folder]tags
834 [File]asd.txt 0바이트
835 [File]README.md 8바이트
836 [File]reset.txt 7바이트
'개발 > 자바(JAVA)' 카테고리의 다른 글
ParameterizedTypeReference(SuperTypeToken) (0) | 2023.06.30 |
---|---|
SuperTypeToken (0) | 2023.06.29 |
컴포지트 패턴 연습 - 1 (0) | 2023.04.13 |
기본형 배열 List로 변환하기 (0) | 2023.03.10 |
객체 지향 - 6 (0) | 2023.02.03 |