「架构师训练营」第 3 周作业 - 模式与重构

用户头像
guoguo 👻
关注
发布于: 2020 年 06 月 23 日
「架构师训练营」第 3 周作业 - 模式与重构

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

对于这个作业,为了检验自己对代码的熟悉程度,在写之前,刻意的没有上网查,完全凭记忆和意识,手写了代码。

使用静态内部类的方法来写单例模式,让jvm让为我们保证线程安全性。只是没使用到静态内部类,就不会去创建对象实例,从而实现了延迟加载和线程安全。



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



UML类



首先定义一个`Component`接口,作为所有窗体组件的抽象,所有的窗体组件均实现此接口的print方法完成打印。

public interface Component {
void print();
}



有的组件有子组件,有的没有子组件。考虑接口隔离原则,抽象一个含有子组件的抽象类:

public abstract class CompositeComponent implements Component {
private String name;
public CompositeComponent(String name) {
this.name = name;
}
private List<Component> components = new ArrayList<>();
public CompositeComponent add(Component component) {
components.add(component);
return this;
}
@Override
public void print() {
// 打印父组件
System.out.println(String.format("print %s", name));
// 打印子组件
for (Component component : components) {
component.print();
}
}
}



WindowForm类

public class WindowForm extends CompositeComponent {
public WindowForm(String name) {
super(name);
}
}



Picture类

public class Picture implements WindowForm {
private String logoPath;
public Picture(String logoPath) {
this.logoPath = logoPath;
}
/**
* 打印Picture
*/
@Override
public void print() {
System.out.println(String.format("print Picture(%s)", logoPath));
}
}



Button类

public class Button implements Component {
private String name;
public Button(String name) {
this.name = name;
}
@Override
public void print() {
System.out.println(String.format("print Button(%s)", name));
}
}



Frame类

public class Frame extends CompositeComponent {
public Frame(String name) {
super(name);
}
}



Label类

public class Label implements Component {
private String text;
public Label(String text) {
this.text = text;
}
@Override
public void print() {
System.out.println(String.format("print Label(%s)", text));
}
}



TextBox类

public class TextBox implements Component {
private String placeHolder;
public TextBox(String placeHolder) {
this.placeHolder = placeHolder;
}
@Override
public void print() {
System.out.println(String.format("print TextBox(%s)", placeHolder));
}
}



PasswordBox类

public class PasswordBox implements Component {
private String placeHolder;
public PasswordBox(String placeHolder) {
this.placeHolder = placeHolder;
}
@Override
public void print() {
System.out.println(String.format("print TextBox(%s)", placeHolder));
}
}



CheckBox类

public class CheckBox implements Component {
@Override
public void print() {
System.out.println("print CheckBox(复选框)");
}
}



LinkLabel类

public class LinkLabel implements Component {
private String text;
public LinkLabel(String text) {
this.text = text;
}
@Override
public void print() {
System.out.println(String.format("print LinkLabel(%s)", text));
}
}



客户端测试类:

public class Client {
public static void main(String[] args) {
CompositeComponent winForm = new WindowForm("WinForm(WINDOW窗口)");
Component picture = new Picture("LOGO图片");
Component loginButton = new Button("登录");
Component registerButton = new Button("注册");
CompositeComponent frame = new Frame("Frame(FRAME1)");
Component usernameLabel = new Label("用户名");
Component usernameTextBox = new TextBox("请输入用户名");
Component passwordLabel = new Label("密码");
Component passwordBox = new PasswordBox("请输入密码");
Component checkbox = new CheckBox();
Component rememberTextBox = new TextBox("记住用户名");
Component linkLabel = new LinkLabel("忘记密码");
frame.add(usernameLabel).add(usernameTextBox).add(passwordLabel).add(passwordBox).add(checkbox).add(rememberTextBox).add(linkLabel);
winForm.add(picture).add(loginButton).add(registerButton).add(frame).print();
}
}



输出结果:

print WinForm(WINDOW窗口)
print Picture(LOGO图片)
print Button(登录)
print Button(注册)
print Frame(FRAME1)
print Label(用户名)
print TextBox(请输入用户名)
print Label(密码)
print TextBox(请输入密码)
print CheckBox(复选框)
print TextBox(记住用户名)
print LinkLabel(忘记密码)



用户头像

guoguo 👻

关注

还未添加个人签名 2017.11.30 加入

还未添加个人简介

评论 (2 条评论)

发布
用户头像
单例中静态内部类的instance建议也是private
2020 年 06 月 29 日 10:26
回复
可见范围最小化 可以。
可能习惯了把属性写public了,不过还好,外部访问不到的,因为Class是private的
2020 年 06 月 29 日 21:57
回复
没有更多了
「架构师训练营」第 3 周作业 - 模式与重构