极客大学 - 架构师培训 -ch3 作业
发布于: 2020 年 11 月 14 日

组件之间的类图设计

代码结构

代表性的类实现代码
- Component接口 
/** * 组件接口 */public interface Component {    // 渲染    void render();}- BaseComponent抽象类 
public abstract class BaseComponent implements Component {    private String name;    public BaseComponent(String name) {        this.name = name;    }    protected String getName() {        return name;    }}- BaseContainer抽象类,编排了接口的render()方法 
public abstract class BaseContainer extends BaseComponent {    private List<Component> components;    public BaseContainer(String name, List<Component> components) {        super(name);        this.components = CollectionUtils.isEmpty(components) ? Collections.emptyList() : components;    }    public void render() {        renderSelf(); // 先render自己        components.forEach(Component::render); // 再render自己的组件    }    // 由子类实现    protected abstract void renderSelf();}- WinForm实现类: 
public class WinForm extends BaseContainer {    public WinForm(String name, List<Component> components) {        super(name, components);    }    @Override    protected void renderSelf() {        System.out.println("print WinForm(" + getName() + ")");    }}- TextBox和PasswordBox实现类(继承关系): 
public class TextBox extends BaseComponent {    public TextBox(String name) {        super(name);    }    @Override    public void render() {        System.out.println("print TextBox(" + getName() + ")");    }}public class PasswordBox extends TextBox {    public PasswordBox(String name) {        super(name);    }    @Override    public void render() {        System.out.println("print PasswordBox(" + getName() + ")");    }}结果测试
直接调用WinForm对象的render()方法
public class Application {    public static void main(String[] args) {        createWinForm().render();    }    private static Component createWinForm() {        // 创建WinForm的组件        List<Component> winFormComponents = new ArrayList<>();        winFormComponents.add(new Picture("LOGO图片"));        winFormComponents.add(new Button("登录"));        winFormComponents.add(new Button("注册"));        winFormComponents.add(createFrame());        // 创建WinForm        return new WinForm("WINDOW窗口", winFormComponents);    }    private static Component createFrame() {        // 创建frame组件        List<Component> frameComponents = new ArrayList<>();        frameComponents.add(new Label("用户名"));        frameComponents.add(new TextBox("文本框"));        frameComponents.add(new Label("密码"));        frameComponents.add(new PasswordBox("密码框"));        frameComponents.add(new CheckBox("复选框"));        frameComponents.add(new TextBox("记住用户名"));        frameComponents.add(new LinkLabel("忘记密码"));        // 创建frame        return new Frame("FRAME1", frameComponents);    }}输出结果

划线
评论
复制
发布于: 2020 年 11 月 14 日阅读数: 23
版权声明: 本文为 InfoQ 作者【bing5tui3】的原创文章。
原文链接:【http://xie.infoq.cn/article/3e3fb18d077b5d49dc8845f60】。未经作者许可,禁止转载。

bing5tui3
关注
还未添加个人签名 2018.09.23 加入
还未添加个人简介











 
    
评论