• java 之 组合模式(大话设计模式)


    代码是一门艺术,每次看完大话设计模式后都会有新的认识,有时会感叹原来还可以这样玩,相信大家都用过递归,递归的使用一般遍历文件夹等会常用到,

    今天讲的设计模式类似于递归,也比较神奇,先看下类图,稍后再帮大家理一下这个设计模式的核心思想。

    大话设计模式-类图

    类图看起来并不复杂,就像一棵大树,枝干上可以有树叶,也可以有分支树干,而分支树干上又可以有树叶...有点拗口,总的来说就是可以不断的扩展下去。

    先看下例子,读者不妨把代码拷贝下去跟着断点运行一次,相信会对组合模式有更深刻的认识,然后在自己写个其他的例子,这样就会记住组合模式。先看下笔者的demo

    /**
     * 抽象公司接口
     */
    public abstract class Company {
    
        private String name;
    
        public Company(String name) {
            super();
            this.name = name;
        }
    
        public abstract void add(Company company);
    
        public abstract void remove(Company company);
    
        public abstract void display(int depth);
    
        public abstract void LineOfDuty();
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    /**
     * 具体公司 类似于树干
     */
    public class ConcreteCompany extends Company{
    
        private List<Company> children = new ArrayList<>();
    
        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 void display(int depth) {
            for (int i = 0; i < depth; i++) {
                System.out.print("-");
            }
            System.out.println(getName());
            for (Company company : children) {
                company.display(depth + 2);
            }
        }
    
        @Override
        public void LineOfDuty() {
            for (Company company : children) {
                company.LineOfDuty();
            }
        }
    
    }
    /**
     * 具体部门,类似于树叶
     */
    public class HRDepartment extends Company {
    
        public HRDepartment(String name) {
            super(name);
        }
    
        @Override
        public void add(Company company) {
    
        }
    
        @Override
        public void remove(Company company) {
    
        }
    
        @Override
        public void display(int depth) {
            for (int i = 0; i < depth; i++) {
                System.out.print("-");
            }
            System.out.println(getName());
        }
    
        @Override
        public void LineOfDuty() {
            System.out.println(getName() + "	员工培训");
    
        }
    
    }
    /**
     * 客户端
     */
    public class Test {
    
        public static void main(String[] args) {
            ConcreteCompany concreteCompany = new ConcreteCompany("北京朝阳公司");
            concreteCompany.add(new HRDepartment("北京朝阳公司人力资源部"));
    
            ConcreteCompany concreteCompany1 = new ConcreteCompany("上海虹桥公司");
            concreteCompany1.add(new HRDepartment("上海虹桥人力资源部"));
            concreteCompany.add(concreteCompany1);
    
            ConcreteCompany concreteCompany2 = new ConcreteCompany("深圳南山公司");
            concreteCompany2.add(new HRDepartment("深圳南山人力资源部"));
            concreteCompany1.add(concreteCompany2);
    
            concreteCompany.display(1);
            concreteCompany.LineOfDuty();
        }
    }

    运行结果:

    -北京朝阳公司
    ---北京朝阳公司人力资源部
    ---上海虹桥公司
    -----上海虹桥人力资源部
    -----深圳南山公司
    -------深圳南山人力资源部
    北京朝阳公司人力资源部    员工培训
    上海虹桥人力资源部    员工培训
    深圳南山人力资源部    员工培训

    跟过断点的读者应该可以理解笔者所说的思想:层层嵌套循环A循环→B循环→C循环...一直把所有的循环全部进行完毕。从对象的角度来看,在循环里不断切换调用同一个方法的对象,直到全部调用完毕

    如果还是理解不了,那就多跟几次断点,一次不行就两次。明白原理后在写个遍历文件的例子。

    以上是是笔者对组合模式的理解,希望能帮助学习的小伙伴!

  • 相关阅读:
    二叉树遍历
    nginx反向代理signalr
    SignalR入坑笔记
    CSS一些特殊图形
    Powershell下git中文乱码
    使用VisualStudio直接运行简单的C#语句
    wpf实现一个windows定时关机的工具
    Asp.NetCoreWebApi
    MySql权限丢失问题解决
    Systemd 入门教程:命令篇
  • 原文地址:https://www.cnblogs.com/zhuxiansheng/p/8033265.html
Copyright © 2020-2023  润新知