写点什么

构架师训练营 - 第 3 周命题作业

用户头像
Dawn
关注
发布于: 2020 年 06 月 24 日
构架师训练营-第3周命题作业



1 请手撕一个鬼子看看

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



各位看官,您没看错,今天的作业第一题就是手撕一个鬼子,来吧:

撕完了,原谅我,为了避免手撕带来的痛苦把这个类作得没心没肺,也没反抗行为!



2 请用组合模式编写一个程序



要求:打印输出图1的窗口,窗口组件的树结构如图2所示。打印输出示例参考图3.









直接上代码吧

  1. BaseCtrl.jave

package cc.dawn.homework.winform.ctrl;
import java.io.PrintStream;
public abstract class BaseCtrl {
public BaseCtrl(String name) {
this.name = name;
}
/**
* 标签名
*/
private String name;
/**
* 获取类型
* @return
*/
public String getType(){
return this.getClass().getSimpleName();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void print(PrintStream stream){
stream.println(String.format("print %s(%s)",getType(), getName()));
}
}



2 Container 容器基类

package cc.dawn.homework.winform.container;
import cc.dawn.homework.winform.ctrl.BaseCtrl;
import cc.dawn.homework.winform.CtrlFactory;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;
public class Container extends BaseCtrl {
/**
* 子节点
*/
private List<BaseCtrl> children;
public Container(String label) {
super(label);
this.children = new ArrayList<>();
}
public <T extends BaseCtrl> Container addChild(Class<T> instClass,String name){
this.children.add(CtrlFactory.create(instClass,name));
return this;
}
public <T extends BaseCtrl> Container addChild(BaseCtrl child){
this.children.add(child);
return this;
}
public List<BaseCtrl> getChildren() {
return children;
}
public void setChildren(List<BaseCtrl> children) {
this.children = children;
}
@Override
public void print(PrintStream stream) {
super.print(stream);
if (children != null) {
for (BaseCtrl baseCtrl : children) {
baseCtrl.print(stream);
}
}
}
}



然后就是让Winform、Frame类继承Container容器类,Button、CheckBox、Lable、LinkLable等继承BaseCtrl,篇幅有限,仅以Winform、Button代码为例:



WinForm.java

package cc.dawn.homework.winform.container;
public class WinForm extends Container {
public WinForm(String label) {
super(label);
}
}



Button.java

package cc.dawn.homework.winform.ctrl;

public class Button extends BaseCtrl {

public Button(String label) {
super(label);
}
}


为了方便测试我决定投资开个工厂



CtrlFactory

package cc.dawn.homework.winform;
import cc.dawn.homework.winform.ctrl.BaseCtrl;
import java.lang.reflect.Constructor;
public class CtrlFactory {
public static <T extends BaseCtrl> T create(Class<T> instClass, String name) {
try {
Constructor<T> constructor = instClass.getConstructor(String.class);
return constructor.newInstance(name);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}



TestWinForm

package cc.dawn.homework.winform.test;
import cc.dawn.homework.winform.CtrlFactory;
import cc.dawn.homework.winform.container.Frame;
import cc.dawn.homework.winform.container.WinForm;
import cc.dawn.homework.winform.ctrl.*;
public class TestWinForm {
public static void main(String[] args) {
CtrlFactory.create(WinForm.class, "WINDOW窗口")
.addChild(Picture.class, "LOGO图片")
.addChild(Button.class, "登录")
.addChild(Button.class, "注册")
.addChild(
CtrlFactory.create(Frame.class, "FRAME1")
.addChild(Lable.class, "用户名")
.addChild(TextBox.class, "文本框")
.addChild(Lable.class, "密码")
.addChild(PasswordBox.class, "密码框")
.addChild(CheckBox.class, "复选框")
.addChild(TextBox.class, "记住用户名")
.addChild(LinkLable.class, "忘记密码")
).print(System.out);
;
}
}



你们要的结果来了:



用户头像

Dawn

关注

还未添加个人签名 2018.07.04 加入

还未添加个人简介

评论

发布
暂无评论
构架师训练营-第3周命题作业