写点什么

架构师训练营 Week3 - 课后作业

用户头像
关注
发布于: 2020 年 10 月 04 日
架构师训练营 Week3 - 课后作业

一、手写单例模式

虽然感觉没问题,手写过程中还是出了差错,第一版把单例的目标指向了其他类,并没有起到实质的单例的作用。

第一版



第二版



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



1. 控制台输出:



2. 接口,类实现

a. Component 接口

package org.architect.eg.window;
public interface Component {
public void paint();
public void paintSelf();
public void addComponent(Component component);
}

b. UIComponent 抽象类

package org.architect.eg.window;
import java.util.ArrayList;
import java.util.List;
public abstract class UIComponent implements Component{
private List<Component> subComponents = new ArrayList<Component>();
private String name;
public void addComponent(Component component) {
subComponents.add(component);
}
public void paint() {
paintSelf();
paintSubComponent();
}
protected void paintSubComponent(){
for (Component component: subComponents) {
component.paint();
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

c. 具体实现类

这里以WinForm类举例,其他组件类实现都类似。区别在于:

  • 类名

  • 构造方法名

  • paintSelf 打印文字的构造方法名

WinForm 类

package org.architect.eg.window.impl;
import org.architect.eg.window.UIComponent;
public class WinForm extends UIComponent {
public WinForm(String name){
this.setName(name);
}
public void paintSelf() {
System.out.println("print WinForm("+this.getName()+")");
}
}

模板:

package org.architect.eg.window.impl;
import org.architect.eg.window.UIComponent;
public class XXXX extends UIComponent {
public XXXX(String name){
this.setName(name);
}
public void paintSelf() {
System.out.println("print XXXX("+this.getName()+")");
}
}

d. 测试类

package org.architect.eg;
import org.architect.eg.window.Component;
import org.architect.eg.window.impl.*;
public class TestWindow {
public static void main(String[] args) {
Component windowForm = new WinForm("WINDOW窗口");
windowForm.addComponent(new Picture("LOGO图片"));
windowForm.addComponent(new Button("登录"));
windowForm.addComponent(new Button("注册"));
Component frame1 = new Frame("FRAME1");
frame1.addComponent(new Label("用户名"));
frame1.addComponent(new TextBox("文本框"));
frame1.addComponent(new Label("密码"));
frame1.addComponent(new PasswordBox("密码框"));
frame1.addComponent(new CheckBox("复选框"));
frame1.addComponent(new TextBox("记住用户名"));
frame1.addComponent(new LinkLabel("忘记密码"));
windowForm.addComponent(frame1);
windowForm.paint();
}
}



用户头像

关注

还未添加个人签名 2018.09.18 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营 Week3 - 课后作业