第三周 - 课后练习

用户头像
jizhi7
关注
发布于: 2020 年 11 月 08 日
  1. 请在草稿纸上手写一个单例模式的实现代码,拍照提交作业。





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





代码UML图:





Component接口是一个顶层的接口,定义了打印的方法。

public interface Component {
void print();
}

有一个AbstractComponent抽象类,它实现了Component接口,维护了每个组建的名称。

public abstract class AbstractComponent implements Component {
protected String componentText;
public AbstractComponent(String componentText) {
this.componentText = componentText;
}
}

Button、Lable、PasswordBox、TextBox、Picture、LinkedLabel、CheckBox等组件继承至AbstractComponent,然后每个组件编写自己的print方法。

public class Button extends AbstractComponent {
public Button(String componentText) {
super(componentText);
}
@Override
public void print() {
System.out.println("print Button(" + componentText + ")");
}
}

Container组件也继承至AbstractComponent组件,但它会有其它的子组件,所以要维护一个子组件的列表,打印的时候,要先打印自己,然后再去遍历子组件掉他们打印方法。

public abstract class Container extends AbstractComponent {
protected List<Component> childrenComponent;
public Container(String componentText) {
super(componentText);
childrenComponent = new ArrayList<>();
}
@Override
public final void print() {
doPrint();
for(Component component : childrenComponent) {
component.print();
}
}
protected abstract void doPrint();
public void addChild(Component component) {
childrenComponent.add(component);
}
}

WinForm等拥有子组件的组件继承至Container,然后实现自己的doPrint方法。

public class WinForm extends Container {
public WinForm(String componentText) {
super(componentText);
}
@Override
public void doPrint() {
System.out.println("print WinForm(" + componentText + ")");
}
}



测试类:

public class Test {
public static void main(String[] args) {
Container win = new WinForm("WINDOW窗口");
win.addChild(new Picture("LOGO图片"));
win.addChild(new Button("登录"));
win.addChild(new Button("注册"));
Container frame1 = new Frame("FRAME1");
win.addChild(frame1);
frame1.addChild(new Lable("用户名"));
frame1.addChild(new TextBox("文本框"));
frame1.addChild(new Lable("密码"));
frame1.addChild(new PasswordBox("密码框"));
frame1.addChild(new CheckBox("复选框"));
frame1.addChild(new TextBox("记住用户名"));
frame1.addChild(new LinkLable("忘记密码"));
win.print();
}
}



执行结果:



用户头像

jizhi7

关注

还未添加个人签名 2018.09.08 加入

还未添加个人简介

评论 (1 条评论)

发布
用户头像
多种写法很赞
2020 年 11 月 15 日 20:25
回复
没有更多了
第三周-课后练习