写点什么

架构师训练营 week03 作业

用户头像
尔东雨田
关注
发布于: 2020 年 07 月 01 日
架构师训练营 week03 作业

1. 手写一个单例模式的实现代码

2. 组合设计模式编写程序

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



组合模式 Composite Pattern

又叫作部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。

包含角色

  • 抽象构件(Component)

  • 叶子构件(Leaf)

  • Composite(容器构件)





抽象构件:抽象类(或接口),为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。在抽象构件中定义了访问及管理它的子构件的方法,如增加子构件、删除子构件、获取子构件等。这里只定义了onDraw()一个方法打印控件名称;

package com.chenlei.demo.composite;
public abstract class Component {
public abstract void onDraw();
}

容器构件:表示容器节点对象,容器节点包含子节点,其子节点可以是叶子节点,也可以是容器节点,它提供一个集合用于存储子节点,实现了在抽象构件中定义的行为。

package com.chenlei.demo.composite;
import java.util.ArrayList;
public abstract class Container extends Component{
private String name;
private java.util.List<Component> subComponents = new ArrayList<>();
public Container(String name){
this.name = name;
}
@Override
public void onDraw() {
System.out.println(String.format("Print %s(%s)",this.getClass().getSimpleName(),name));
subComponents.forEach(Component::onDraw);
}
public void addComponent(Component subComponent){
subComponents.add(subComponent);
};
}

叶子构件:组合结构中表示叶子节点对象,叶子节点没有子节点,它实现了在抽象构件中定义的行为。对于那些访问及管理子构件的方法,可以通过异常等方式进行处理,这里叶子构件只实现Component的onDraw()方法。



定义 WinForm、Frame为容器构件。

package com.chenlei.demo.composite;
public class WinForm extends Container{
public WinForm(String name) {
super(name);
}
}



package com.chenlei.demo.composite;
public class Frame extends Container {
public Frame(String name) {
super(name);
}
}

叶子构件:Button、CheckBox、Label、LinkLabel、PassowrdBox、Picture、TextBox。

package com.chenlei.demo.composite;
public class Button extends Component{
private String name;
public Button(String name){
this.name = name;
}
@Override
public void onDraw() {
System.out.println(String.format("Print %s(%s)",this.getClass().getSimpleName(),name));
}
}



package com.chenlei.demo.composite;
public class CheckBox extends Component{
private String name;
public CheckBox(String name) {
this.name = name;
}
@Override
public void onDraw() {
System.out.println(String.format("Print %s(%s)",this.getClass().getSimpleName(),name));
}
}



package com.chenlei.demo.composite;
public class Label extends Component {
private String name;
public Label(String name){
this.name = name;
}
@Override
public void onDraw() {
System.out.println(String.format("Print %s(%s)",this.getClass().getSimpleName(),name));
}
}



package com.chenlei.demo.composite;
public class LinkLabel extends Component{
private String name;
public LinkLabel(String name) {
this.name = name;
}
@Override
public void onDraw() {
System.out.println(String.format("Print %s(%s)",this.getClass().getSimpleName(),name));
}
}



package com.chenlei.demo.composite;
public class PasswordBox extends Component{
private String name;
public PasswordBox(String name) {
this.name = name;
}
@Override
public void onDraw() {
System.out.println(String.format("Print %s(%s)",this.getClass().getSimpleName(),name));
}
}



package com.chenlei.demo.composite;
public class PictureBox extends Component{
private String name;
public PictureBox(String name){
this.name = name;
}
@Override
public void onDraw() {
System.out.println(String.format("Print %s(%s)",this.getClass().getSimpleName(),name));
}
}



package com.chenlei.demo.composite;
public class TextBox extends Component{
private String name;
public TextBox(String name) {
this.name = name;
}
@Override
public void onDraw() {
System.out.println(String.format("Print %s(%s)",this.getClass().getSimpleName(),name));
}
}



测试打印

package com.chenlei.demo;
import com.chenlei.demo.composite.*;
public class Main {
public static void main(String[] args) {
WinForm winForm = new WinForm("Window 窗口");
PictureBox pictureBox = new PictureBox("LOGO 图片");
Button loginBtn = new Button("登录");
Button registerBtn = new Button("注册");
winForm.addComponent(pictureBox);
winForm.addComponent(loginBtn);
winForm.addComponent(registerBtn);
Frame frame = new Frame("FRAME1");
Label userNameLbl = new Label("用户名");
TextBox userNameTbx = new TextBox("文本框");
Label passwordLbl = new Label("密码");
PasswordBox passwordBox = new PasswordBox("密码框");
CheckBox checkBox = new CheckBox("复选框");
TextBox rememberMeTbx = new TextBox("记住用户名");
LinkLabel forgetPwdLbl = new LinkLabel("忘记密码");
frame.addComponent(userNameLbl);
frame.addComponent(userNameTbx);
frame.addComponent(passwordLbl);
frame.addComponent(passwordBox);
frame.addComponent(checkBox);
frame.addComponent(rememberMeTbx);
frame.addComponent(forgetPwdLbl);
winForm.addComponent(frame);
winForm.onDraw();
}
}



结果:



用户头像

尔东雨田

关注

预备用枪! 2017.12.12 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营 week03 作业