写点什么

【第三周】命题作业——单例及组合模式

用户头像
三尾鱼
关注
发布于: 2020 年 06 月 25 日

1. 请在草稿纸上手写一个单例模式的实现代码,拍照提交作业

答:

  • 饿汉模式

关键点:构造器私有,私有实例变量静态且final

  • 懒汉模式

关键点:构造器私有,私有实例变量静态且volatile,防止指令重排,获取实例方法同步且双重检查。



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





答:

以下展示的是代码实现和说明。



  1. Render接口,组合模式需要继承的接口

package xyz.hs.geek.training.week3;

/**
* @author huangsui
* Created on 2020/6/24
*/
public interface Render {
void render();
}




  1. Widget类,Render接口的一个简单实现

package xyz.hs.geek.training.week3;

/**
* @author huangsui
* Created on 2020/6/24
*/
public abstract class Widget implements Render {

private String content;

public Widget(String content) {
this.content = content;
}

@Override
public void render() {
System.out.println("print "+getType()+"("+content+")");
}

public abstract String getType();

}




  1. ContainerWidget类,组合模式的体现,继承了Widget(因为容器自身也有渲染需要,所有直接继承了Widget),覆盖render实现。

package xyz.hs.geek.training.week3;

import java.util.List;

/**
* @author huangsui
* Created on 2020/6/24
*/
public abstract class ContainerWidget extends Widget {

private List<Widget> widgets;

public ContainerWidget(String content) {
super(content);
}

@Override
public void render() {
super.render();
if(widgets!=null && widgets.size()>0){
for (Widget widget: widgets){
widget.render();
}
}
}

public void setWidgets(List<Widget> widgets) {
this.widgets = widgets;
}


}




  1. WinForm类,一个容器部件,继承ContainerWidget

package xyz.hs.geek.training.week3.wgt;

import xyz.hs.geek.training.week3.ContainerWidget;

/**
* @author huangsui
* Created on 2020/6/24
*/
public class WinForm extends ContainerWidget {
public WinForm(String content) {
super(content);
}

@Override
public String getType() {
return "WinForm";
}
}




  1. Button类,一个简单部件,继承Widget

package xyz.hs.geek.training.week3.wgt;

import xyz.hs.geek.training.week3.Widget;

/**
* @author huangsui
* Created on 2020/6/24
*/
public class Button extends Widget {
public Button(String content) {
super(content);
}

@Override
public String getType() {
return "Button";
}
}

  1. App类及所有部件类参见下图



  1. 执行App输出



说明:这里体现组合模式的是ContainerWidget类,内部包含了Widget列表,且与Widget实现同一接口,render方法执行时对内部Widget列表进行逐个渲染。

(这里Widget,ContainerWidget使用抽象类,是为了减少代码编写,真实场景要具体分析)



发布于: 2020 年 06 月 25 日阅读数: 121
用户头像

三尾鱼

关注

还未添加个人签名 2018.07.10 加入

还未添加个人简介

评论

发布
暂无评论
【第三周】命题作业——单例及组合模式