1. 程式人生 > 實用技巧 >HashMap 底層實現原理

HashMap 底層實現原理

組合模式

一、簡介

將物件組合成樹形結構以表示“部分-整體”的層次結構,使得使用者對單個物件和組合物件的使用具有一致性。

二、使用場景

  • 表示物件的部分-整體層次結構時
  • 從一個整體中能夠獨立出部分模組或功能的場景

三、簡單實現

我們以電腦系統中的資料夾系統為例來簡單實現組合模式。我們知道檔案系統是由資料夾和問價構成的,資料夾中可以包含問價或資料夾。

    public abstract class Dir{
        protected List<Dir> dirs=new ArrayList<>();
        private  String name;

        public Dir(String name) {
            this.name = name;
        }
        public abstract void addDir(Dir dir);
        public abstract void print();
        public abstract List<Dir> getFiles();

        public String getName() {
            return name == null ? "" : name;
        }

    }

    public class Folder extends Dir{

        public Folder(String name) {
            super(name);
        }

        @Override
        public void addDir(Dir dir) {
         dirs.add(dir);
        }

        @Override
        public void print() {
            Log.i(TAG, "print: "+getName());
            for (Dir dir : dirs) {
                dir.print();
            }
        }

        @Override
        public List<Dir> getFiles() {
            return dirs;
        }
    }

    public class File extends Dir{

        public File(String name) {
            super(name);
        }

        @Override
        public void addDir(Dir dir) {
          throw new UnsupportedOperationException("檔案不支援該操作");
        }

        @Override
        public void print() {
            Log.i(TAG, "print: "+getName());
        }

        @Override
        public List<Dir> getFiles() {
            throw new UnsupportedOperationException("檔案不支援該操作");
        }
    }

    public void tset(){
        Folder folderC=new Folder("C");
        Folder txtFolder=new Folder("-txtFolder");
        Folder picFolder=new Folder("-picFolder");
        File file1=new File("-file1");
        File file2=new File("--file2");
        File file3=new File("--file3");

        txtFolder.addDir(file2);
        picFolder.addDir(file3);

        folderC.addDir(txtFolder);
        folderC.addDir(picFolder);
        folderC.addDir(file1);

        folderC.print();
    }

四、小結

在Android中組合模式有一個非常經典的實現就是View和ViewGroup的巢狀組合。一般來將我們在實際開發過程中對於組合模式使用的並不是很多。

組合模式的優點就是可以清楚的定意思分層次的複雜物件,讓高層模組忽略層次的差異,方便對整個層次結構進行控制。高層模組可以一致的使用一個組合結構或其中單個物件。

組合模式的缺點就是在新增構建時不好對質感中的構建型別進行限制,不能依賴型別系統來施加這些約束。