组合模式

2017-10-15  本文已影响11人  刘尔泽

直接看code

public abstract class File {

    private String name;

    public File(String name) {
        this.name = name;
    }

    //操作方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public abstract void watch();

    //组合方法
    public void add(File file) {
        throw new UnsupportedOperationException();
    }

    public void remove(File file) {
        throw new UnsupportedOperationException();
    }

    public File getChild(int position) {
        throw new UnsupportedOperationException();
    }
}


public class TextFile extends File {

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

    @Override
    public void watch() {
        System.out.printf("组合模式", "这是一个叫" + getName() + "文本文件");
    }
}

public class Folder extends File {

    private List<File> mFileList;

    public Folder(String name) {
        super(name);
        mFileList = new ArrayList<>();
    }

    @Override
    public void watch() {
        StringBuffer fileName = new StringBuffer();
        for (File file : mFileList) {
            fileName.append(file.getName() + ";");
        }
       
        System.out.printf("组合模式", "这是一个叫" + getName() + "文件夹,包含" + mFileList.size() + "个文件,分别是:" + fileName);
    }

    @Override
    public void add(File file) {
        mFileList.add(file);
    }

    @Override
    public void remove(File file) {
        mFileList.remove(file);
    }

    @Override
    public File getChild(int position) {
        return mFileList.get(position);
    }
}

测试代码

public class testComposite {
    public static void main(String[] strings) {
        TextFile textFileA = new TextFile("a.txt");
        TextFile textFileB = new TextFile("b.txt");
        TextFile textFileC = new TextFile("c.txt");

        textFileA.watch();
    //  textFileA.add(textFileB);//调用会抛我们在抽象接口中写的异常

        Folder folder = new Folder("学习资料");
        folder.add(textFileA);
        folder.add(textFileB);
        folder.add(textFileC);

        folder.watch();
        folder.getChild(1).watch();
    }

}

在android中的使用

ViewGroup 是抽象类
最重要的是 那俩接口

public abstract class ViewGroup extends View implements ViewParent, ViewManager {
}

先看 ViewMangaer

public interface ViewManager
{
  
    public void addView(View view, ViewGroup.LayoutParams params);
    public void updateViewLayout(View view, ViewGroup.LayoutParams params);
    public void removeView(View view);
}

再看 viewParent

public interface ViewParent {

    public void requestLayout();//并不是立即执行的,有一段时间的,因为是以发送消息的形式

    public boolean isLayoutRequested();//所以就有这方法

    public ViewParent getParent();

}

View 的 onlayout 是空方法
ViewGroup 的 onlayout 是 abstract的

组合模式,其实不太多。

上一篇 下一篇

猜你喜欢

热点阅读