极客大学架构师课程 - 第三周 - 作业
发布于: 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 条评论)