自学教程 学编程从这里开始

组合视图模式

《组合视图模式》|J2EE企业架构模式

关键词:Composite View、页面组件化、布局模板、页面片段组合
说明:组合视图模式不属于GOF23设计模式,属于J2EE企业架构模式

一、什么是组合视图模式

组合视图模式(Composite View Pattern):将一个完整页面拆分为多个独立可复用的子视图片段(头部、侧边栏、内容区、底部),通过组合拼装成最终页面。单个子视图可以独立复用,修改子视图不会影响整体页面结构。

注意:虽然名字带Composite,但不是GOF组合模式,只是借鉴了“整体由部分组成”思想。

核心意图
页面组件化,把页面拆分为多个可复用子视图片段,组装生成完整页面,统一管理页面布局。

角色划分

  1. Client(客户端):浏览器发起请求
  2. Composite View(组合视图):主视图模板,负责组装多个子视图
  3. View Component(视图组件/子视图):页面片段,如header、footer、sidebar,可独立渲染

数据流:
Client → CompositeView → 依次渲染多个ViewComponent → 合并输出完整页面

二、UML结构图

角色划分:

  1. Client:请求方
  2. CompositeView:主视图,组装子组件
  3. ViewComponent:子视图组件
  4. ConcreteViewComponent:具体页面片段(Header、Footer等)

三、Java完整示例

模拟页面由头部、内容、底部三个子视图拼接而成,代码全部使用英文。

// View Component
public interface ViewComponent {
    void render();
}

// Concrete View Component
public class HeaderView implements ViewComponent {
    @Override
    public void render() {
        System.out.println("==== Page Header ====");
    }
}

public class ContentView implements ViewComponent {
    private String content;
    public ContentView(String content){
        this.content = content;
    }
    @Override
    public void render() {
        System.out.println("Page Content: " + content);
    }
}

public class FooterView implements ViewComponent {
    @Override
    public void render() {
        System.out.println("==== Page Footer ====");
    }
}

// Composite View
import java.util.ArrayList;
import java.util.List;
public class CompositeView implements ViewComponent {
    private List<ViewComponent> componentList = new ArrayList<>();

    public void addComponent(ViewComponent component){
        componentList.add(component);
    }

    @Override
    public void render() {
        for(ViewComponent component : componentList){
            component.render();
        }
    }
}

// Client
public class Client {
    public static void main(String[] args) {
        CompositeView page = new CompositeView();
        page.addComponent(new HeaderView());
        page.addComponent(new ContentView("Hello Composite View Pattern"));
        page.addComponent(new FooterView());
        page.render();
    }
}

运行输出:

==== Page Header ====
Page Content: Hello Composite View Pattern
==== Page Footer ====

四、组合视图模式 vs GOF组合模式

模式分类区别
组合视图模式J2EE架构模式Web页面模板拆分,页面片段组装成完整页面
组合模式(Composite)GOF结构型模式通用树形对象结构,统一对待叶子对象和容器对象

组合视图内部可以使用GOF组合模式实现,但二者不是同一个东西。

五、优缺点总结

✅ 优点

  1. 页面片段复用,头部、底部一次编写,所有页面共用
  2. 页面模块化,修改局部片段不改动整体页面
  3. 布局统一管控,便于维护网站风格
  4. 支持动态组装页面,按需加载子视图

❌ 缺点

  1. 多层嵌套页面片段,调试页面渲染链路麻烦
  2. 组件之间数据传递容易混乱
  3. 嵌套层级过多会降低渲染性能

六、框架应用场景

  • JSP include 页面片段
  • Thymeleaf 布局模板、Freemarker宏
  • Vue/React组件化页面(前端组件化思想同源)
  • SpringMVC页面布局框架

七、小结

组合视图模式核心:将完整页面拆分为多个独立子视图组件,由组合视图拼装所有片段,生成最终页面,实现页面组件复用。

归属:J2EE架构模式,不属于GOF23。

0 条笔记