极客大学架构师课程 - 第三周 - 作业
发布于: 2020 年 11 月 08 日
手写单例模式
基于静态内部类实现,静态内部类实现单例的好处是,能直接依赖于 JVM 类加载机制保证对象实例化时的线程安全性,并且由于时静态内部类,只有当使用静态内部类时,才会加载和初始化内部类,也能保证延迟加载的特性。
绘制窗口
题目是:基于组合模式实现窗口打印绘制
基本类图
核心代码
接口
/**
* 组件接口
* @author wellman
*/
public interface Component {
/**
* 打印输出所有组件,即显示题目结果,通过文字输出
* @author wellman
*/
void print();
/**
* 向当前组件添加子组件
* @author wellman
*/
void add(Component component);
/**
* 删除子组件
* @author wellman
*/
void remove(Component component);
}
复制代码
抽象类
/**
* 抽象组件,维护组件名称以及其子组件
* @author wellman
*/
public abstract class AbstractComponent implements Component {
private final List<Component> childList = new ArrayList<>(16);
/**
* 组件名称
*/
private final String name;
public AbstractComponent(String name) {
this.name = name;
generateComponent();
}
@Override
public void add(Component component) {
childList.add(component);
}
@Override
public void remove(Component component) {
childList.remove(component);
}
@Override
public void print() {
System.out.println("绘制:" + name);
childList.forEach(Component::print);
}
/**
* 钩子方法,允许子类创建包含子组件的复杂组件
* @author wellman
*/
protected abstract void generateComponent();
}
复制代码
窗口组件实现-复杂组件
/**
* Window窗口组件
* @author wellman
*/
public class WinForm extends AbstractComponent {
public WinForm(String name) {
super(name);
}
@Override
protected void generateComponent() {
Component picture = new Picture("LOGO图片");
super.add(picture);
Component frame = new Frame("Frame");
super.add(frame);
Component loginBtn = new Button("登录");
super.add(loginBtn);
Component registerBtn = new Button("注册");
super.add(registerBtn);
}
}
复制代码
Frame 组件实现-复杂组件
/**
* Frame组件
* @author wellman
*/
public class Frame extends AbstractComponent {
public Frame(String name) {
super(name);
}
@Override
protected void generateComponent() {
Component name = new Label("用户名");
super.add(name);
Component nameBox = new TextBox("请输入用户名");
super.add(nameBox);
Component pwd = new Label("密码");
super.add(pwd);
Component pwdBox = new PasswordBox("密码框");
super.add(pwdBox);
Component checkBox = new CheckBox("复选框");
super.add(checkBox);
Component remember = new TextBox("记住用户名");
super.add(remember);
Component link = new LinkLabel("忘记密码");
super.add(link);
}
}
复制代码
按钮组件
其余组件没有特殊性,同按钮组件,忽略
/**
* 按钮
* @author wellman
*/
public class Button extends AbstractComponent {
public Button(String name) {
super(name);
}
@Override
protected void generateComponent() {
}
}
复制代码
测试方法
/**
* 测试客户端
* @author wellman
*/
public class Client {
public static void main(String[] args) {
Component win = new WinForm("Window窗口");
win.print();
}
}
复制代码
输出结果
绘制:Window窗口
绘制:LOGO图片
绘制:Frame
绘制:用户名
绘制:请输入用户名
绘制:密码
绘制:密码框
绘制:复选框
绘制:记住用户名
绘制:忘记密码
绘制:登录
绘制:注册
复制代码
划线
评论
复制
发布于: 2020 年 11 月 08 日阅读数: 34
版权声明: 本文为 InfoQ 作者【井中人】的原创文章。
原文链接:【http://xie.infoq.cn/article/78222b901f4bdfa7d513c0d02】。未经作者许可,禁止转载。
井中人
关注
还未添加个人签名 2018.08.24 加入
还未添加个人简介
评论 (2 条评论)