1. 请在草稿纸上手写一个单例模式的实现代码,拍照提交作业。
完成情况:DCL双检查锁机制的单例模式(Java)

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

完成情况如下:
1、概念
组合模式(Composite Pattern)将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户可以使用一致的方法操作单个对象和组合对象。
组合关系与聚合关系的区别:
(1)组合关系:在古代皇帝三宫六院,贵妃很多,但是每一个贵妃只属于皇帝。
(2)聚合关系:一个老师有很多学生,但是每一个学生又属于多个老师。
Container.java
public abstract class Container {
private String name;
private String type;
public Container(String name,String type) {
super();
this.name = name;
this.type=type;
}
public abstract void add(Container form);
public abstract void remove(Container form);
public abstract void display(int depth);
public String getName() {
return name;
}
public void setType(String type) {
this.type = type;
}
public String getType() {
return type;
}
public void setName(String name) {
this.name = name;
}
}
Control.java
public class Control extends Container {
public Control(String name,String type) {
super(name,type);
}
@Override
public void add(Container form) {
}
@Override
public void remove(Container form) {
}
@Override
public void display(int depth) {
for (int i = 0; i < depth; i++) {
System.out.print(" ");
}
System.out.println("print "+getType()+ "("+getName()+")");
}
}
Frame.java
public class Frame extends Container {
private List<Container> children = new ArrayList<>();
public Frame(String name,String type) {
super(name,type);
}
@Override
public void add(Container form) {
children.add(form);
}
@Override
public void remove(Container form) {
children.remove(form);
}
@Override
public void display(int depth) {
for (int i = 0; i < depth; i++) {
System.out.print(" ");
}
System.out.println("print "+getType()+ "("+getName()+")");
for (Container form : children) {
form.display(depth + 2);
}
}
}
Winform.java
public class Winform extends Container {
private List<Container> children = new ArrayList<>();
public Winform(String name,String type) {
super(name,type);
}
@Override
public void add(Container form) {
children.add(form);
}
@Override
public void remove(Container form) {
children.remove(form);
}
@Override
public void display(int depth) {
for (int i = 0; i < depth; i++) {
System.out.print(" ");
}
System.out.println("print "+getType()+ "("+getName()+")");
for (Container container : children) {
container.display(depth + 2);
}
}
}
Main.java
public class Main {
public static void main(String[] args) {
// write your code here
Winform winForm = new Winform("Windows窗口","Windows");
Frame frame = new Frame("FRAME1","Frame");
Control lflogo = new Control("LOGO","Picture");
Control lflogin = new Control("登录","Button");
Control lfregister = new Control("注册","Button");
Control cUname = new Control("用户名","Label");
Control cUnameVal = new Control("用户名","TextBox");
Control cPass = new Control("密码","Label");
Control cPassVal = new Control("密码","TextBox");
Control remLabel = new Control("记住用户名","Label");
Control remChkBox = new Control("记住用户名","CheckBox");
Control linkLabel = new Control("忘记密码","LinkLabel");
winForm.add(lflogo);
winForm.add(lflogin);
winForm.add(lfregister);
winForm.add(frame);
frame.add(cUname);
frame.add(cUnameVal);
frame.add(cPass);
frame.add(cPassVal);
remLabel.add(remChkBox);
frame.add(remLabel);
frame.add(linkLabel);
winForm.display(0);
}
}
程序输出如下:
print Windows(Windows窗口)
print Picture(LOGO)
print Button(登录)
print Button(注册)
print Frame(FRAME1)
print Label(用户名)
print TextBox(用户名)
print Label(密码)
print TextBox(密码)
print Label(记住用户名)
print LinkLabel(忘记密码)