组合模式实现树结构

用户头像
新世界
关注
发布于: 2020 年 06 月 24 日
组合模式实现树结构



首先手写一个单例设计模式:





需求说明:





实现分析:

定义打印接口

/**
* @author wangqp
* @desc component interface define
* @date 2020年06月23日16:09:54
*/
public interface Component {
/**
* 打印组件信息
*/
void print();
}



定义容器接口:

/**
* @author wangqp
* @desc container component
* @date 2020年06月24日10:10:17
*/
public interface ContainerComponent extends Component {
/**
* add component
* @param component
*/
void addComponent(Component component);
/**
* remove component
* @param component
*/
void removeComponent(Component component);
}



容器实现两个接口:

1、 component 2、ContainerComponent 相当于拥有两种能力



import java.util.ArrayList;
import java.util.List;
/**
* @author wangqp
* @desc win form component
* @date 2020年06月23日16:29:33
*/
public class WinForm implements ContainerComponent {
private List<Component> componentList;
private String desc;
public WinForm(String desc){
this.desc = desc;
componentList = new ArrayList<>();
}
@Override
public void print() {
System.out.println(String.format("print WinForm(%s)",desc));
for (Component component: componentList) {
component.print();
}
}
@Override
public void addComponent(Component component){
this.componentList.add(component);
}
@Override
public void removeComponent(Component component){
this.componentList.remove(component);
}
}



Frame代码:

import java.util.ArrayList;
import java.util.List;
/**
* @author wangqp
* @desc frame component
* @date 2020年06月23日16:33:11
*/
public class Frame implements ContainerComponent {
private List<Component> componentList;
private String desc;
public Frame(String desc){
this.desc = desc;
this.componentList = new ArrayList<>();
}
@Override
public void print() {
System.out.println(String.format("print Frame(%s)",desc));
for (Component component : componentList) {
component.print();
}
}
@Override
public void addComponent(Component component) {
componentList.add(component);
}
@Override
public void removeComponent(Component component) {
componentList.remove(component);
}
}



叶子节点 Button CheckBox Label LinkLabel PasswordBox Picture TextBox



/**
* @author wangqp
* @desc button component
* @date 2020年06月23日16:31:58
*/
public class Button implements Component {
private String desc;
public Button(String desc){
this.desc = desc;
}
@Override
public void print() {
System.out.println(String.format("print Button(%s)",desc));
}
}
/**
* @author wangqp
* @desc CheckBox Component
* @date 2020年06月23日16:39:57
*/
public class CheckBox implements Component {
private String desc;
public CheckBox(String desc){
this.desc = desc;
}
@Override
public void print() {
System.out.println(String.format("print CheckBox(%s)",desc));
}
}
/**
* @author wangqp
* @desc label component
* @date 2020年06月23日16:34:22
*/
public class Label implements Component {
private String desc;
public Label(String desc){
this.desc = desc;
}
@Override
public void print() {
System.out.println(String.format("print Label(%s)",desc));
}
}
/**
* @author wangqp
* @desc LinkLabel Component
* @date 2020年06月23日16:41:12
*/
public class LinkLabel implements Component {
private String desc;
public LinkLabel(String desc){
this.desc = desc;
}
@Override
public void print() {
System.out.println(String.format("print LinkLabel(%s)",desc));
}
}
/**
* @author wangqp
* @desc PasswordBox
* @date 2020年06月23日16:38:36
*/
public class PasswordBox implements Component {
private String desc;
public PasswordBox(String desc){
this.desc = desc;
}
@Override
public void print() {
System.out.println(String.format("print LinkLabel(%s)",desc));
}
}
/**
* @author wangqp
* @desc picture view
* @date 2020年06月23日17:19:28
*/
public class Picture implements Component {
private String desc;
public Picture(String desc){
this.desc = desc;
}
@Override
public void print() {
System.out.println(String.format("print Picture(%s)",desc));
}
}
/**
* @author wangqp
* @desc TextBox component
* @date 2020年06月23日16:36:18
*/
public class TextBox implements Component{
private String desc;
public TextBox(String desc){
this.desc = desc;
}
@Override
public void print() {
System.out.println(String.format("print TextBox(%s)",desc));
}
}



执行结果类以及执行结果



/**
* @author wangqp
* @desc component view
* @date 2020年06月23日16:46:09
*/
public class ComponentView {
public static void main(String[] args) {
Picture picture = new Picture("LOGO图片");
WinForm winForm = new WinForm("WINDOW窗口");
winForm.addComponent(picture);
Button loginButton = new Button("登录");
Button registerButton = new Button("注册");
winForm.addComponent(loginButton);
winForm.addComponent(registerButton);
Frame frame = new Frame("FRAME1");
Label userName = new Label("用户名");
frame.addComponent(userName);
TextBox userNameTextBox = new TextBox("文本框");
frame.addComponent(userNameTextBox);
Label passwordLabel = new Label("密码");
frame.addComponent(passwordLabel);
PasswordBox passwordBox = new PasswordBox("密码框");
frame.addComponent(passwordBox);
CheckBox checkBox = new CheckBox("复选框");
frame.addComponent(checkBox);
TextBox rememberUsername = new TextBox("记住用户名");
frame.addComponent(rememberUsername);
LinkLabel forgetPassword = new LinkLabel("忘记密码");
frame.addComponent(forgetPassword);
winForm.addComponent(frame);
winForm.print();
}
}



执行结果



print WinForm(WINDOW窗口)
print Picture(LOGO图片)
print Button(登录)
print Button(注册)
print Frame(FRAME1)
print Label(用户名)
print TextBox(文本框)
print Label(密码)
print LinkLabel(密码框)
print CheckBox(复选框)
print TextBox(记住用户名)
print LinkLabel(忘记密码)



学习总结体会:



通过手写单例设计模式,突然感觉脱离编辑器写代码,特别困难,勉强写出来,并且字也特别丑,

看来应该把其他设计模式都动手实现一遍,看代码和自己写代码完全是两回事。



很多东西比如现有的框架都需要自己去造轮子,重复造轮子才能体会到轮子的设计的精妙之处。



编程是动手能力比较强的实践活动,应该多练习,多总结,多调试源代码。



给自己立个flag,后期把开源框架的源码都学习一遍,至少都自己调试一遍,不然无法体会到设计之道



用户头像

新世界

关注

还未添加个人签名 2018.03.29 加入

还未添加个人简介

评论

发布
暂无评论
组合模式实现树结构