设计模式(八):组合模式

108 阅读1分钟

介绍

组合模式(Composite Pattern)属于结构型模式,它创建了对象组的树形结构

优点

  • 高层调用简单
  • 子节点易于扩展

缺点

  • 在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则

应用

文件管理,Android中view、viewgroup的实现

实现

关键代码

树枝含有内部属性 List,里面存放其子节点

// 实现了一个简易的命令行,文件管理系统
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

class File {
    private String name;
    private List<File> childeren;
  
    //构造函数
    public File(String name) {
       this.name = name;
       childeren = new ArrayList<File>();
    }
  
    public void add(File e) {
        childeren.add(e);
    }
  
    public void remove(File e) {
        childeren.remove(e);
    }
  
    public List<File> getSubordinates(){
      return childeren;
    }
  
    public String toString(){
       return name;
    }
 }

 class CompositePatternDemo {
   public static void main(String[] args) {
      File disk = new File("C");
 
      File system = new File("system");
      File user = new File("user");
 
      File system_1 = new File("Kernel");
      File system_2 = new File("etc");

      File user_1 = new File("Program Files");
      File user_2 = new File("Games");

      disk.add(system);
      disk.add(user);
 
      system.add(system_1);
      system.add(system_2);
 
      user.add(user_1);
      user.add(user_2);

      Scanner scan = new Scanner(System.in);
      File current = disk;
      
      System.out.print("[user://"+current.toString()+"]");
      while(true){
        if (scan.hasNextLine()) {
            String str1 = scan.nextLine();

            if(str1.equals("help") ){
              System.out.println("please type cd/ls");
              System.out.print("[user://"+current.toString()+"]");
            }

            if(str1.startsWith("cd")){
                boolean exist = false;
                for(File f:current.getSubordinates()){
                    if(str1.endsWith(f.toString())){
                        exist = true;
                        current = f;
                    }
                }
                if(!exist){System.out.println("error");}
                System.out.print("[user://"+current.toString()+"]");
            }
            
            if(str1.equals("ls")){
                for(File f:current.getSubordinates()){
                    System.out.print(f.toString()+" ");
                }
                System.out.println();
                System.out.print("[user://"+current.toString()+"]");
            }
        }
      }
   }
}

运行结果

[user://C]ls
system user 
[user://C]cd system
[user://system]ls
Kernel etc 
[user://system]cd etc
[user://etc]ls
[user://etc]