写点什么

2020-06-20- 第三周作业

发布于: 2020 年 06 月 24 日

1 作业一

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





2 作业二

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

图 1 窗口图例

图 2 窗口组件树结构

// 代码示例1 程序输出示例print WinForm(WINDOW窗口)print Picture(LOGO图片)print Button(登录)print Button(注册)print Frame(FRAME1)print Label(用户名)print TextBox(文本框)print Label(密码)print PasswordBox(密码框)print CheckBox(复选框)print TextBox(记住用户名)print Label(忘记密码)
复制代码


:根据图 2 的窗口组件树结构可知,共有两种节点:一种是叶子节点,另一种是非叶子节点。其中非叶子节点可以有多个叶子节点,而叶子节点则无任何子节点。故而将这两类节点分别抽象为 Container 和 Component 抽象类,且同时实现 Graphic 接口。而这两个抽象类又派生出各自的子类,比如 Container 派生出 WinForm 和 Frame 子类,Component 派生出 Label、Button 等子类。具体类图如下所示。


以上使用了组合模式,其中 Graphic 为抽象组件接口,定义了 draw 方法用于绘制图像;Container 为组合对象,定义包含哪些子组件,并实现了 draw 方法;Component 为叶子对象,定义叶子对象,并实现 draw 方法,且不再包含其他的子节点对象。


程序代码如下所示:

// Graphic.javapublic interface Graphic {    void draw();}
复制代码


// Container.javapublic abstract class Container implements Graphic {    private String name;        // 容器名称    private Graphic[] list;  // 容器内的元素列表
public Container(String name, Graphic... comps) { this.name = name; this.list = comps; }
public void draw() { System.out.println("print " + this.getClass().getSimpleName() + "(" + this.name + ")"); for(Graphic graphic : list) { graphic.draw(); } }}
复制代码


// Component.javapublic abstract class Component implements Graphic{
private String name;
public Component(String name) { this.name = name; }
public void draw() { System.out.println("print " + this.getClass().getSimpleName()+ "(" + this.name + ")"); }}
复制代码


// WinForm.javapublic class WinForm extends Container {    public WinForm(String name, Graphic... comps) {        super(name, comps);    }}
复制代码


// Button.javapublic class Button extends Component {    public Button(String name) {        super(name);    }}
复制代码

为便于查看,以上派生类中仅列出了 WinForm 和 Button 类。程序的执行入口是下面的 Main 类。经测试,输出与预期相符。

// Main.javapublic class Main {    public static void main(String[] args) {        Graphic winForm = new WinForm("WINDOW窗口",                new Picture("LOGO图片"),                new Button("登录"),                new Button("注册"),                new Frame("FRAME1",                        new Label("用户名"),                        new TextBox("文本框"),                        new Label("密码"),                        new PasswordBox("密码框"),                        new CheckBox("复选框"),                        new TextBox("记住用户名"),                        new Label("忘记密码")));        winForm.draw();    }}
复制代码


用户头像

还未添加个人签名 2020.05.11 加入

还未添加个人简介

评论

发布
暂无评论
2020-06-20-第三周作业