架构师训练营 week03 作业

发布于: 2020 年 06 月 24 日

1、请在草稿纸上手写一个单例模式的实现代码,拍照提交作业。

饿汉模式:

懒汉模式:

2、请用组合设计模式编写程序,打印输出图 1 的窗口,窗口组件的树结构如图 2 所示,打印输出示例参考图 3。

可以考虑维护一个控件列表,然后运用组合模式实现该程序。具体代码如下:

1、先定义一个控件接口:

package cn.beinet; import java.util.List; public interface Control { /** * 输出控件信息 */ void print(); /** * 返回当前控件名 * * @return 控件名 */ String getName(); /** * 设置当前控件名 */ void setName(String name); /** * 返回子控件清单,不需要子控件时,要重写抛出异常 * * @return 控件清单 */ List<Control> getChilds(); /** * 添加子结点,不需要子控件时,要重写抛出异常 * * @param control 结点 * @return 返回子结点个数 */ int addChild(Control control); }

2、定义控件基类,抽象出常用方法(这里是模板模式)

import java.util.ArrayList; import java.util.List; public abstract class BaseControl implements Control { private List<Control> childs = new ArrayList<>(); private String name; @Override public String getName() { return name; } @Override public void setName(String name) { this.name = name; } @Override public List<Control> getChilds() { return childs; } @Override public void print() { System.out.println(String.format("print %s(%s)", this.getClass().getSimpleName(), getName())); List<Control> childs = getChilds(); if (childs != null) { for (Control ctl : childs) { ctl.print(); } } } @Override public int addChild(Control control) { List<Control> childs = getChilds(); if (childs == null) { return 0; } if (control != null) { childs.add(control); } return childs.size(); } }

3、定义基本控件类

class WinForm extends BaseControl { } class Button extends BaseControl { } class CheckBox extends BaseControl { } class Frame extends BaseControl { } class Label extends BaseControl { } class LinkLabel extends BaseControl { } class PassowrdBox extends BaseControl { } class Picture extends BaseControl { } class TextBox extends BaseControl { }

4、main方法

public class Main { public static void main(String[] args) throws IllegalAccessException, InstantiationException { // 声明主窗体 Control mainForm = new WinForm(); mainForm.setName("WINDOW窗口"); // 添加子控件 addChilds(mainForm); // 绘画整个窗体 mainForm.print(); } static <T> Control createChild(String name, Class<T> clasz) throws IllegalAccessException, InstantiationException { Control child = (Control) clasz.newInstance(); child.setName(name); return child; } static void addChilds(Control mainForm) throws InstantiationException, IllegalAccessException { mainForm.addChild(createChild("LOGO图片", Picture.class)); mainForm.addChild(createChild("登录", Button.class)); mainForm.addChild(createChild("注册", Button.class)); Control frame = createChild("FRAME1", Frame.class); mainForm.addChild(frame); frame.addChild(createChild("用户名", Label.class)); frame.addChild(createChild("文本框", TextBox.class)); frame.addChild(createChild("密码", Label.class)); frame.addChild(createChild("密码框", PasswordBox.class)); frame.addChild(createChild("复选框", CheckBox.class)); frame.addChild(createChild("记住用户名", TextBox.class)); frame.addChild(createChild("忘记密码", LinkLabel.class)); } }

5、执行结果

print WinForm(WINDOW窗口) print Picture(LOGO图片) print Button(登录) print Button(注册) print Frame(FRAME1) print Label(用户名) print TextBox(文本框) print Label(密码) print PasswordBox(密码框) print CheckBox(复选框) print TextBox(记住用户名) print LinkLabel(忘记密码)

本次作业个人没有完全理解,参考了这位水边同学的做法

用户头像

Up

关注

代码,思考,架构,阅读,旅行。 2018.11.02 加入

一起来进步吧,持续学习的小白!

评论

发布
暂无评论
架构师训练营week03作业