【架构师训练营】week 3 homework

发布于: 2020 年 06 月 24 日
【架构师训练营】week 3 homework

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

主要手写了懒汉式和饿汉式两种方式实现的单例模式。单例模式的特点:

  • 构造函数需要是 private 访问权限的,这样才能避免外部通过 new 创建实例;

  • 考虑对象创建时的线程安全问题;

  • 考虑是否支持延迟加载;

  • 考虑 getInstance() 性能是否高(是否加锁)。

二、用组合设计模式编写程序

1.组件抽象类

public abstract class AbstractComponentNode {
private String name;
public AbstractComponentNode(String name) {
this.name = name;
}
/**
* 抽象方法:打印控件
*/
public abstract void print();
public String getName() {
return name;
}
}

2.抽象容器类

public abstract class AbstractContainer extends AbstractComponentNode {
private List<AbstractComponentNode> subNodes = new ArrayList<>();
public AbstractContainer(String name) {
super(name);
}
/**
* 获取子元素列表
*/
public List<AbstractComponentNode> getSubNodes(){
return subNodes;
}
/**
* 添加子元素
*/
public void addSubNode(AbstractComponentNode node){
subNodes.add(node);
}
}

3.组件实现类

public class Button extends AbstractComponentNode {
public Button(String name) {
super(name);
}
@Override
public void print() {
//...画一个Button
System.out.println("Button("+getName()+")");
}
}
public class CheckBox extends AbstractComponentNode {
public CheckBox(String name) {
super(name);
}
@Override
public void print() {
//...画一个CheckBox
System.out.println("CheckBox("+getName()+")");
}
}
public class Label extends AbstractComponentNode {
public Label(String name) {
super(name);
}
@Override
public void print() {
//...画一个Label
System.out.println("Label("+getName()+")");
}
}
public class LinkLabel extends AbstractComponentNode {
public LinkLabel(String name) {
super(name);
}
@Override
public void print() {
//...画一个LinkedLabel
System.out.println("LinkedLabel("+getName()+")");
}
}
public class PasswordBox extends AbstractComponentNode {
public PasswordBox(String name) {
super(name);
}
@Override
public void print() {
//...画一个PasswordBox
System.out.println("PasswordBox("+getName()+")");
}
}
public class Picture extends AbstractComponentNode {
public Picture(String name) {
super(name);
}
@Override
public void print() {
//...画一个Picture
System.out.println("Picture("+getName()+")");
}
}
public class TextBox extends AbstractComponentNode {
public TextBox(String name) {
super(name);
}
@Override
public void print() {
//...画一个TextBox
System.out.println("TextBox("+getName()+")");
}
}

4.容器实现类

public class WinForm extends AbstractContainer {
public WinForm(String name) {
super(name);
}
@Override
public void print() {
//...画WinForm
System.out.println("WinForm("+getName()+")");
for(AbstractComponentNode node:getSubNodes()){
node.print();
}
}
}
public class Frame extends AbstractContainer {
public Frame(String name) {
super(name);
}
@Override
public void print() {
//...画一个Frame
System.out.println("Frame("+getName()+")");
for(AbstractComponentNode node:getSubNodes()){
node.print();
}
}
}

5.输出

WinForm window = new WinForm("Window窗口");
Picture picture= new Picture("LOGO图片");
Button button1 = new Button("登录");
Button button2 = new Button("注册");
window.addSubNode(picture);
window.addSubNode(button1);
window.addSubNode(button2);
Frame frame = new Frame("FRAME1");
Label label1 = new Label("用户名");
TextBox textBox = new TextBox("文本框");
Label label2 = new Label("密码");
PasswordBox passwordBox = new PasswordBox("密码框");
CheckBox checkBox = new CheckBox("复选框");
Label label3 = new Label("记住用户名");
LinkLabel linkLabel = new LinkLabel("忘记密码");
frame.addSubNode(label1);
frame.addSubNode(textBox);
frame.addSubNode(label2);
frame.addSubNode(passwordBox);
frame.addSubNode(checkBox);
frame.addSubNode(label3);
frame.addSubNode(linkLabel);
window.addSubNode(frame);
window.print();

输出结果:

WinForm(Window窗口)
Picture(LOGO图片)
Button(登录)
Button(注册)
Frame(FRAME1)
Label(用户名)
TextBox(文本框)
Label(密码)
PasswordBox(密码框)
CheckBox(复选框)
Label(记住用户名)
LinkedLabel(忘记密码)

用户头像

eazonshaw

关注

还未添加个人签名 2019.04.10 加入

还未添加个人简介

评论

发布
暂无评论
【架构师训练营】week 3 homework