《大话设计模式》java实现之组合模式

来源:互联网 发布:泼墨门事件知乎 编辑:程序博客网 时间:2024/06/05 08:34

组合模式主要是体现部分与整体层次的结构,统一使用结构中的所有对象(书中原话)。
个人理解:组合模式多用于树状展现的内容中。

本示例省略书中的履行职责方法,这个对该模式没什么影响
UML图
这里写图片描述
代码结构
这里写图片描述

public class Client {    public static void main(String[] args) {        ConcreteCompany root = new ConcreteCompany("北京总公司");        root.add(new HRDepartment("总公司人力资源部"));        root.add(new FinanceDepartment("总公司财务部"));        ConcreteCompany comp = new ConcreteCompany("上海华东分公司");        comp.add(new HRDepartment("东分公司人力资源部"));        comp.add(new FinanceDepartment("东分公司财务部"));        root.add(comp);        ConcreteCompany comp1 = new ConcreteCompany("南京办事处");        comp1.add(new HRDepartment("南京办事处人力资源部"));        comp1.add(new FinanceDepartment("南京办事处财务部"));        comp.add(comp1);        ConcreteCompany comp2 = new ConcreteCompany("杭州办事处");        comp2.add(new HRDepartment("杭州办事处人力资源部"));        comp2.add(new FinanceDepartment("杭州办事处财务部"));        comp.add(comp2);        System.out.println("结构图");        root.display(1);    }}
public abstract class Company {    private String name;     //书中是procteced,为了和以往编程习惯一致,这里使用private    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Company() {                  //保留无参构造方法        super();    }    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 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 component : children) {            component.display(depth + 2);        }    }}
public class FinanceDepartment extends Company {    public FinanceDepartment(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());    }}
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());    }}

结果
这里写图片描述
多说一句,从上面可以看到HRDepartment和FinanceDepartment的display方法都是重复的代码,这个可以用模版方法模式进行优化,在父类定义一个方法template,然后子类调用,ConcreCompany调用父类后再添加自己的逻辑即可。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 腰压迫的腿疼怎么办 肩胛提肌固定不住怎么办 胳膊粗后背肉多怎么办 2岁儿童 肋骨边缘外翻怎么办 5岁宝宝盆骨前倾怎么办 脖子弯了像驼背怎么办 都40周了还没生怎么办 股骨头坏死骨盆歪了怎么办 二胎侧切伤口疼怎么办 小月子盆骨酸痛怎么办 盆骨一边大一边小怎么办 快生了宫颈管长怎么办 想顺产 宫颈管长怎么办 腰和跨一样宽怎么办 脚后跟骨折手术后小腿变细怎么办 生完孩子骨盆错位怎么办 皮肤又黑又粗糙怎么办 翠研珠宝被坑了怎么办 领导是小人我该怎么办 微信二维码重置了怎么办 衣服有蝽的卵怎么办 人坐牢去了房贷怎么办 人死了欠的房贷怎么办 体育生文化没过怎么办 舍友偷了钱没证据怎么办 舍友要一直开空调怎么办 和大学室友相处不愉快怎么办 和舍友三观不合怎么办 室友欠200钱忘了怎么办 和舍友闹矛盾了怎么办 被宿舍人孤立了怎么办 分到一个爱管事的舍友怎么办 添加了村人名录怎么办 打csgo出现卡顿怎么办 csgo创意工坊下载慢怎么办 电脑全是英文死机了怎么办 亿盛国际出金后不到账怎么办 玩游戏的界面很大怎么办电脑 文件缺失导致电脑无法启动怎么办 眼睛里拉出白丝怎么办 脚扭了脚面肿了怎么办