架构师训练营 - 第三周作业

用户头像
清风徐徐
关注
发布于: 2020 年 06 月 23 日

作业一:

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

饿汉式:类加载时就实例化对象,使用时直接返回

懒汉式:类加载时先不实例化,使用时再实例化,为了防止多线程问题,方法内加入类同步锁



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



组合模式的定义:

将一组对象(员工和部门)组织成树形结构,以表示一种‘部分 - 整体’的层次结构(部门与子部门的嵌套结构)。组合模式让客户端可以统一单个对象(员工)和组合对象(部门)的处理逻辑(递归遍历)。

从图2-窗口组件树形结构得知,在所有组件中,只有WinForm和Frame包含子组件,所有组件都有共同的打印自身的逻辑,WinForm和Frame除了打印自身外,还需要遍历打印子组件信息。因此,根据组合模式,可以定义一个包含打印定义方法的组件抽象基类。

类设计如下:

定义组件抽象类Component,统一定义打印方法

public abstract class Component {
protected String name;
public Component(String name){
this.name = name;
}
public abstract void print();
}

WinForm类

public class WinForm extends Component{
private List<Component> componentList = new ArrayList<>();
public WinForm(String name){
super(name);
}
public void addComponent(Component component){
componentList.add(component);
}
@Override
public void print() {
System.out.println(MessageFormat.format("print {0}({1})", this.getClass().getName(),this.name));
for (Component component : componentList) {
component.print();
}
}
}

Picture类

public class Picture extends Component{
public Picture(String name){
super(name);
}
@Override
public void print() {
System.out.println(MessageFormat.format("print {0}({1})", this.getClass().getName(),this.name));
}
}

Button类

public class Button extends Component{
public Button(String name){
super(name);
}
@Override
public void print() {
System.out.println(MessageFormat.format("print {0}({1})", this.getClass().getName(),this.name));
}
}

Frame类

public class Frame extends Component{
private List<Component> componentList = new ArrayList<>();
public Frame(String name){
super(name);
}
public void addComponent(Component component){
componentList.add(component);
}
@Override
public void print() {
System.out.println(MessageFormat.format("print {0}({1})",this.getClass().getName(),this.name));
for (Component component : componentList) {
component.print();
}
}
}



Label类

public class Label extends Component{
public Label(String name){
super(name);
}
@Override
public void print() {
System.out.println(MessageFormat.format("print {0}({1})", this.getClass().getName(),this.name));
}
}



TextBox类

public class TextBox extends Component{
public TextBox(String name){
super(name);
}
@Override
public void print() {
System.out.println(MessageFormat.format("print {0}({1})", this.getClass().getName(),this.name));
}
}



PasswordBox类

public class PasswordBox extends Component{
public PasswordBox(String name){
super(name);
}
@Override
public void print() {
System.out.println(MessageFormat.format("print {0}({1})", this.getClass().getName(),this.name));
}
}



CheckBox类

public class CheckBox extends Component{
public CheckBox(String name){
super(name);
}
@Override
public void print() {
System.out.println(MessageFormat.format("print {0}({1})", this.getClass().getName(),this.name));
}
}



LinkLable类

public class LinkLable extends Component{
public LinkLable(String name){
super(name);
}
@Override
public void print() {
System.out.println(MessageFormat.format("print {0}({1})", this.getClass().getName(),this.name));
}
}



Main类

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

运行结果:

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 LinkLable(忘记密码)

用户头像

清风徐徐

关注

还未添加个人签名 2019.03.25 加入

还未添加个人简介

评论

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