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

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

    组合模式代码地址
    image.png

    Component 抽象类

    1. public abstract class Component {
    2. private final String name;
    3. private String parentName;
    4. public Component(String name) {
    5. this.name = name;
    6. }
    7. public String getName() {
    8. return this.name;
    9. }
    10. public String getParentName() {
    11. return parentName;
    12. }
    13. public void setParentName(String parentName) {
    14. this.parentName = parentName;
    15. }
    16. public abstract void print();
    17. }
    1. public class ElementComponent extends Component{
    2. public ElementComponent(String name) {
    3. super(name);
    4. }
    5. @Override
    6. public void print() {
    7. System.out.println(getParentName() + " 的叶子节点: " + getName());
    8. }
    9. }
    1. public class ElementContainer extends Component {
    2. private List<Component> subComponentList = new ArrayList<>();
    3. public ElementContainer(String name) {
    4. super(name);
    5. }
    6. public void addElement(Component c) {
    7. c.setParentName(this.getName());
    8. subComponentList.add(c);
    9. }
    10. public List<Component> getSubComponentList() {
    11. return subComponentList;
    12. }
    13. @Override
    14. public void print() {
    15. System.out.println("树枝节点: " + getName());
    16. }
    17. }
    1. public class Client {
    2. private static ElementContainer root;
    3. public static void main(String[] args) {
    4. init();
    5. root.print();
    6. printInfo(root);
    7. }
    8. private static void init() {
    9. // 创建对象
    10. ElementContainer window = new ElementContainer("window窗口");
    11. ElementContainer frame = new ElementContainer("登录Frame");
    12. Component logoPic = new ElementComponent("logo图片");
    13. Component loginButton = new ElementComponent("登录按钮");
    14. Component registerButton = new ElementComponent("注册按钮");
    15. Component usernameLabel = new ElementComponent("用户名label");
    16. Component usernameTextBox = new ElementComponent("用户名文本框");
    17. Component passwordLabel = new ElementComponent("密码label");
    18. Component passwordTextBox = new ElementComponent("密码文本框");
    19. Component rememberPasswordCheckBox = new ElementComponent("是否记住密码复选框");
    20. Component rememberPasswordLabel = new ElementComponent("记住密码label");
    21. Component forgetPasswordLink = new ElementComponent("忘记密码link");
    22. // 组装
    23. window.addElement(logoPic);
    24. window.addElement(frame);
    25. window.addElement(loginButton);
    26. window.addElement(registerButton);
    27. frame.addElement(usernameLabel);
    28. frame.addElement(usernameTextBox);
    29. frame.addElement(passwordLabel);
    30. frame.addElement(passwordTextBox);
    31. frame.addElement(rememberPasswordCheckBox);
    32. frame.addElement(rememberPasswordLabel);
    33. frame.addElement(forgetPasswordLink);
    34. root = window;
    35. }
    36. private static void printInfo(ElementContainer root) {
    37. if (root != null && !root.getSubComponentList().isEmpty()) {
    38. for (Component e : root.getSubComponentList()) {
    39. e.print();
    40. if (e instanceof ElementContainer) {
    41. printInfo((ElementContainer)e);
    42. }
    43. }
    44. }
    45. }
    46. }

    打印结果

    1. 树枝节点: window窗口
    2. window窗口 的叶子节点: logo图片
    3. 树枝节点: 登录Frame
    4. 登录Frame 的叶子节点: 用户名label
    5. 登录Frame 的叶子节点: 用户名文本框
    6. 登录Frame 的叶子节点: 密码label
    7. 登录Frame 的叶子节点: 密码文本框
    8. 登录Frame 的叶子节点: 是否记住密码复选框
    9. 登录Frame 的叶子节点: 记住密码label
    10. 登录Frame 的叶子节点: 忘记密码link
    11. window窗口 的叶子节点: 登录按钮
    12. window窗口 的叶子节点: 注册按钮