设计模式 ----组合模式

2020-10-11  本文已影响0人  瀚海网虫

1. 基本定义

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

我们通过下面的实例来演示组合模式的用法。实例演示了一个组织中员工的层次结构。

2. 示意图

Android的UI 组件,ViewGroup 和View 之间就属于典型的组合模式。


image.png

3. 解决的问题

意图:将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

何时使用: 1、您想表示对象的部分-整体层次结构(树形结构)。 2、您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

如何解决:树枝和叶子实现统一接口,树枝内部组合该接口。

4. 代码实现

class ViewGroup extends View{
    private List<View> views;
     
    public ViewGroup(String name) {
        super(name);
        views = new ArrayList<View>();
    }
    
    public void addView(View view) {
        views.add(view);
    }
    
    public void removeView(View view) {
        views.remove(view);
    }
    
    @Override
    void draw() {
        for (View view : views) {
            if (view instanceof ViewGroup) {
                System.out.println("开始绘制ViewGroup " + view.getName() + "-----------");
                view.draw ();
                System.out.println("结束绘制ViewGroup " + view.getName() + "-----------");
            } else {
                System.out.println("开始绘制View " + view.getName());
            }
            
        }
    }
}

class View {
    String name;
        
    public View(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public View() {
    }
    
    void draw() {
        System.out.println("开始绘制View" + getName());
    }
    
}

客户端代码

public class CompositeModelTest {   
    public static void main(String[] args) {
        ViewGroup vg_child = new ViewGroup("layout");
    
        View view_btn = new View("Button");
        View view_tv = new View("TextView");
        View view_img = new View("ImageView");
        
        vg_child.addView(view_btn);
        vg_child.addView(view_tv);
        vg_child.addView(view_img);
        
        View view_s = new View("View_Single");
        
        ViewGroup vg = new ViewGroup("Root"); 
        vg.addView(view_s);
        vg.addView(vg_child);
        
        vg.draw();
        
    }
    
}

程序运行结果

开始绘制View View_Single
开始绘制ViewGroup layout-----------
开始绘制View Button
开始绘制View TextView
开始绘制View ImageView
结束绘制ViewGroup layout-----------
上一篇 下一篇

猜你喜欢

热点阅读