极客大学 - 架构师培训 -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 加入
还未添加个人简介
评论