组合模式实现树结构
发布于: 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,后期把开源框架的源码都学习一遍,至少都自己调试一遍,不然无法体会到设计之道
划线
评论
复制
发布于: 2020 年 06 月 24 日 阅读数: 29
新世界
关注
还未添加个人签名 2018.03.29 加入
还未添加个人简介
评论