美文网首页
大话设计模式-组合模式-2020-10-21

大话设计模式-组合模式-2020-10-21

作者: 勇往直前888 | 来源:发表于2020-10-22 11:53 被阅读0次

    定义

    组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对各个对象和组合对象的使用具有一致性。

    结构图

    image.png

    使用场景

    • 透明方式就是说在Component中声明所有用来管理子对象方法,其中包含add和remove等。这样实现component接口的所有子类都具备add和remove。这样做的好处就是叶节点和枝节点对于外界来说没有区别,他们具备完全一致的接口。但是问题也很明显,因为leaf类本身不具备add和remove的功能,所以实现它是没有意义的。

    • 如果考虑安全方式,也就是在component中不声明add和remove方法, 那么子类leaf就不需要去实现它,而是在composite声明所有用来管理子类对象的方法。不过由于不够透明,所以树叶和树枝类将不具备相同的接口,客户端的调用需要做相应的处理,也带来了一些不方便。

    • 当你发现需求中体现部分和整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时,就应该考虑使用组合模式了。

    公司管理系统的例子

    • 结构图
    image.png
    • Company,(Component),基类,定义统一的方法
    /**
     * 公司类,抽象类或者接口
     */
    abstract class Company {
        protected String name;
        public Company(String name) {
            this.name = name;
        }
    
        public abstract void add(Company company); // 增加
        public abstract void remove(Company company); // 移除
        public abstract String display(int depth); // 显示
        public abstract String lineOfDuty(); // 履行职责
    }
    
    • ConcreteCompany,(Composite);有子节点的节点对象;总公司,分公司,办事处等
    /**
     * 具体公司类;实现接口;数枝节点
     */
    class ConcreteCompany extends Company {
        private ArrayList<Company> children = new ArrayList<Company>();
    
        public ConcreteCompany(String name) {
            super(name);
        }
    
        @Override
        public void add(Company company) {
            children.add(company);
        }
    
        @Override
        public void remove(Company company) {
            children.remove(company);
        }
    
        @Override
        public String display(int depth) {
            String message = new String();
            for (int i = 0; i < depth; i++) {
                message += "-";
            }
            message += name;
            message += "\n";
    
            for (Company company:
            children) {
                message += company.display(depth + 2);
            }
            return message;
        }
    
        @Override
        public String lineOfDuty() {
            String message = new String();
            for (Company company:
                 children) {
                message += company.lineOfDuty();
            }
            return message;
        }
    }
    
    • HRDepartment, FinanceDepartment, (Leaf), 叶子;具体的部分,人力资源部,财务部等
    class FinanceDepartment extends Company {
        public FinanceDepartment(String name) {
            super(name);
        }
    
        @Override
        public void add(Company company) {
            // 叶子节点; 什么也不做
        }
    
        @Override
        public void remove(Company company) {
            // 叶子节点; 什么也不做
        }
    
        @Override
        public String display(int depth) {
            String message = new String();
            for (int i = 0; i < depth; i++) {
                message += "-";
            }
            message += name;
            message += "\n";
            return message;
        }
    
        @Override
        public String lineOfDuty() {
            return name + "======" + "公司财务收支管理" + "\n";
        }
    }
    
    /**
     * 人力资源部; 叶子节点
     */
    class HRDepartment extends Company {
        public HRDepartment(String name) {
            super(name);
        }
    
        @Override
        public void add(Company company) {
            // 叶子节点; 什么也不做
        }
    
        @Override
        public void remove(Company company) {
            // 叶子节点; 什么也不做
        }
    
        @Override
        public String display(int depth) {
            String message = new String();
            for (int i = 0; i < depth; i++) {
                message += "-";
            }
            message += name;
            message += "\n";
            return message;
        }
    
        @Override
        public String lineOfDuty() {
            return name + "======" + "员工招聘培训管理" + "\n";
        }
    }
    
    • 测试界面
    image.png
    • 客户端程序
    public class CompositeActivity extends AppCompatActivity {
        public static void launch(Context context) {
            if (null != context) {
                Intent intent = new Intent();
                intent.setClass(context, CompositeActivity.class);
                if (!(context instanceof Activity)) {
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                }
                context.startActivity(intent);
            }
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_composite);
            setTitle("组合模式");
    
            TextView treeTextView = findViewById(R.id.textViewTree);
            TextView dutyTextView = findViewById(R.id.textViewDuty);
    
            ConcreteCompany root = new ConcreteCompany("北京总公司");
            root.add(new HRDepartment("总公司人力资源部"));
            root.add(new FinanceDepartment("总公司财务部"));
    
            ConcreteCompany company = new ConcreteCompany("上海华东分公司");
            company.add(new HRDepartment("华东分公司人力资源部"));
            company.add(new FinanceDepartment("华东分公司财务部"));
            root.add(company);
    
            ConcreteCompany nanjing = new ConcreteCompany("南京办事处");
            nanjing.add(new HRDepartment("南京办事处人力资源部"));
            nanjing.add(new FinanceDepartment("南京办事处财务部"));
            company.add(nanjing);
    
            ConcreteCompany hangzhou = new ConcreteCompany("杭州办事处");
            hangzhou.add(new HRDepartment("杭州办事处人力资源部"));
            hangzhou.add(new FinanceDepartment("杭州办事处财务部"));
            company.add(hangzhou);
    
            String tree = "结构图:\n" + root.display(1);
            treeTextView.setText(tree);
    
            String duty = "职责:\n" + root.lineOfDuty();
            dutyTextView.setText(duty);
        }
    }
    

    Demo地址

    https://gitee.com/zhangxusong888/Android/tree/master/design_pattern

    相关文章

      网友评论

          本文标题:大话设计模式-组合模式-2020-10-21

          本文链接:https://www.haomeiwen.com/subject/zlosmktx.html