一个简单的组合模式练习题

组合模式

练习

请用组合设计模式编写程序,打印输出图 1 的窗口,窗口组件的树结构如图 2 所示,打印输出示例参考图 3。
在这里插入图片描述

什么是组合模式

引用维基百科:在软件工程中,组合模式是一种分区设计模式。组合模式描述了一组对象,这些对象被视为同一类型对象的单个实例。组合的目的是将对象“组合”成树形结构以表示部分-整体层次结构。实施这模式可以使客户统一对待各个对象和构图;

do

在上述题目中,根据图2的树形结构可以知道,每个窗口组件都为同一类型对象,一个对象可以包含同类型的多个对象。所以我们可以抽象一个组件对象,定义出具有的功能,然后每个窗口的中的组件就可以去分别实例化,最终按照图中的树形结构组合到一起。
模式中最简定义两个角色即可,一个组件抽象类,一个组件抽象的实现。

/**
 * 定义的组件抽象类
 */
public abstract class Component {
    
    

    public abstract void print();
    public abstract void add(Component c);

}

/**
 * 用于实例化的组件实现类
 */
public class SubComponent extends Component {
    
    

    private String subComponentName;

    public SubComponent(String name){
    
    
        subComponentName = name;
    }

    private List<Component> list;

    @Override
    public void print(){
    
    
        if( ObjectUtils.isEmpty(list) ){
    
    
            System.out.println("I am "+subComponentName+" !");
            return;
        }
        for (Component c:list){
    
    
            c.print();
        }
    }

    @Override
    public void add(Component c){
    
    
        if( ObjectUtils.isEmpty(list) ) {
    
    
            list = new ArrayList<>();
        }
        list.add(c);
    }

}

/**
 * 测试类
 */
public class TestCombination {
    
    

    public static void main(String[] args) {
    
    

        Component winForm = new SubComponent("WinForm窗口");
        Component picture = new SubComponent("Picture图片");
        Component login = new SubComponent("Button-login-登录");
        Component register = new SubComponent("Button-register-注册");
        Component frame = new SubComponent("FRAME1");

        Component label1 = new SubComponent("Label-用户名");
        Component textBox1 = new SubComponent("TextBox-文本框");
        Component label2 = new SubComponent("Lable-密码");
        Component passwordBox = new SubComponent("PassWordBox-密码框");
        Component checkbox = new SubComponent("CheckBox-复选框");
        Component textBox2 = new SubComponent("TextBox-记住用户名");
        Component linkLabel = new SubComponent("LinkLabel-忘记密码");

        frame.add(label1);
        frame.add(textBox1);
        frame.add(label2);
        frame.add(passwordBox);
        frame.add(checkbox);
        frame.add(textBox2);
        frame.add(linkLabel);

        winForm.add(picture);
        winForm.add(login);
        winForm.add(register);
        winForm.add(frame);

        winForm.print();
    }

}

组件模式很简单,实现的功能却很直接,大家可以多思考一下,每种设计模式其实是实际模型的一个抽象。如上文中的例子我们其实还可以组合模式+策略模型+模板方法模式去扩充,就看大家实际情况的应用了。

猜你喜欢

转载自blog.csdn.net/weiyi_world/article/details/106952811