写点什么

极客大学架构师课程 - 第三周 - 作业

用户头像
井中人
关注
发布于: 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
用户头像

井中人

关注

还未添加个人签名 2018.08.24 加入

还未添加个人简介

评论 (2 条评论)

发布
用户头像
generateComponent是不是可以用add的方法让外部调用
2020 年 11 月 15 日 20:24
回复
谢谢点评。我最开始的想法也是所有的组装都交给客户端调用的时候自行选择,但是后面我的考虑是,客户端实际应该只想知道我需要绘制一个整体的页面,页面里面的每个部分都是一个小模块,每个模块有什么自己单独维护。因为对我们这个实现而言,每一个 Component 的具体实现其实都是独特的,所以我把每个模块的构造交给了模块自身
2020 年 11 月 22 日 11:25
回复
没有更多了
极客大学架构师课程-第三周-作业