2020-06-20- 第三周作业

用户头像
路易斯李李李
关注
发布于: 2020 年 06 月 24 日



1 作业一

请在草稿纸上手写一个单例模式的实现代码









2 作业二

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

图1 窗口图例

图2 窗口组件树结构

// 代码示例1 程序输出示例
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 Label(忘记密码)



:根据图2的窗口组件树结构可知,共有两种节点:一种是叶子节点,另一种是非叶子节点。其中非叶子节点可以有多个叶子节点,而叶子节点则无任何子节点。故而将这两类节点分别抽象为Container和Component抽象类,且同时实现Graphic接口。而这两个抽象类又派生出各自的子类,比如Container派生出WinForm和Frame子类,Component派生出Label、Button等子类。具体类图如下所示。



以上使用了组合模式,其中Graphic为抽象组件接口,定义了draw方法用于绘制图像;Container为组合对象,定义包含哪些子组件,并实现了draw方法;Component为叶子对象,定义叶子对象,并实现draw方法,且不再包含其他的子节点对象。



程序代码如下所示:

// Graphic.java
public interface Graphic {
void draw();
}



// Container.java
public abstract class Container implements Graphic {
private String name; // 容器名称
private Graphic[] list; // 容器内的元素列表
public Container(String name, Graphic... comps) {
this.name = name;
this.list = comps;
}
public void draw() {
System.out.println("print " + this.getClass().getSimpleName() + "(" + this.name + ")");
for(Graphic graphic : list) {
graphic.draw();
}
}
}



// Component.java
public abstract class Component implements Graphic{
private String name;
public Component(String name) {
this.name = name;
}
public void draw() {
System.out.println("print " + this.getClass().getSimpleName()+ "(" + this.name + ")");
}
}



// WinForm.java
public class WinForm extends Container {
public WinForm(String name, Graphic... comps) {
super(name, comps);
}
}



// Button.java
public class Button extends Component {
public Button(String name) {
super(name);
}
}

为便于查看,以上派生类中仅列出了WinForm和Button类。程序的执行入口是下面的Main类。经测试,输出与预期相符。

// Main.java
public class Main {
public static void main(String[] args) {
Graphic winForm = new WinForm("WINDOW窗口",
new Picture("LOGO图片"),
new Button("登录"),
new Button("注册"),
new Frame("FRAME1",
new Label("用户名"),
new TextBox("文本框"),
new Label("密码"),
new PasswordBox("密码框"),
new CheckBox("复选框"),
new TextBox("记住用户名"),
new Label("忘记密码")));
winForm.draw();
}
}



用户头像

路易斯李李李

关注

还未添加个人签名 2020.05.11 加入

还未添加个人简介

评论

发布
暂无评论
2020-06-20-第三周作业