设计模式之组合模式

来源:互联网 发布:如何查看网址的端口号 编辑:程序博客网 时间:2024/06/05 06:54

组合模式可以用在树状结构的组合当中,把上下级对象抽象出一个基类,通过这个基类可以实现带分支的父节点,也可以实现单个末端节点。

基类用来提供添加和删除子分支的方法,尽管末端节点不需要添加分支,但还是把编辑子分支的方法统一放到基类当中省去判断节点种类。每个节点的职责可以直接抽象,或者添加一个默认实现:

public abstract class Component {    String name;    public Component(String name) {        this.name = name;    }    abstract void add(Component component);    abstract void remove(Component component);    void function(int level) {        StringBuilder sb = new StringBuilder();        for (int i = 0; i < level; i++) {            sb.append("    ");        }        sb.append(name);        System.out.println(sb.toString());    }}

最基本的可以只定义两种类型的实现:
带有分支的实现:

public class ParentCompany extends Component {    private List<Component> list = new ArrayList<>();    public ParentCompany(String name) {        super(name);    }    @Override    void add(Component component) {        list.add(component);    }    @Override    void remove(Component component) {        list.remove(component);    }    @Override    void function(int level) {        super.function(level);        level++;        for (int i = 0; i < list.size(); i++) {            list.get(i).function(level);        }    }}

不带分支的实现:

public class EndCompany extends Component {    public EndCompany(String name) {        super(name);    }    @Override    void add(Component component) {    }    @Override    void remove(Component component) {    }}

测试类:

public class Main {    public static void main(String[] args) {        final ParentCompany country = new ParentCompany("国家级总公司");        final ParentCompany province = new ParentCompany("省级总公司");        final EndCompany provinceEnd = new EndCompany("省级办事处");        final ParentCompany city = new ParentCompany("市级总公司");        final EndCompany cityEnd1 = new EndCompany("市级办事处1");        final EndCompany cityEnd2 = new EndCompany("市级办事处2");        final EndCompany townEnd = new EndCompany("镇级办事处");        country.add(province);        country.add(provinceEnd);        province.add(city);        province.add(cityEnd1);        province.add(cityEnd2);        city.add(townEnd);        country.function(0);    }}

输出:

国家级总公司    省级总公司        市级总公司            镇级办事处        市级办事处1        市级办事处2    省级办事处

对于更复杂的情况可以进一步派生不同的实现,细分更多的分支和终端节点。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机号丢失微信密码丢失怎么办找回 悦借钱输入五次密码被锁怎么办 生源地助学贷款密码忘了怎么办 生源地助学贷款登录密码忘了怎么办 助学贷款支付宝密码忘了怎么办 微信密码忘记了手机号也换了怎么办 换手机号了微信密码忘记了怎么办 qq密码忘记了手机号也换了怎么办 一年只能修改一次昵称我能怎么办 华为手机的账号和密码丢失怎么办 华为手机的账号和密码丢失了怎么办 手机号被别人注册了微博怎么办 微博账号一天内多次解冻怎么办 露娜注册时邮箱填错了怎么办 苹果4s手机显示已停用怎么办 新买的微博小号太多内容了怎么办 向海关申报价格低于实际价格怎么办 百度云下载内容包含违规信息怎么办 跨境汇款错了不能退款怎么办 公司欠钱没有还被起诉了。怎么办 战网的姓名不是身份证名字怎么办 手机号码被别人注册了微信怎么办 手机号码被别人注册过微信怎么办 手机号码换了微信密码忘了怎么办 手机号码停了微信密码忘了怎么办 微信好友发的视频删了怎么办 随机生成的微信号搜索不到怎么办 支付宝账户登录密码忘记了怎么办 淘宝支付宝登录密码忘记了怎么办 生源地贷款支付宝账号忘了怎么办 手机号丢了微信找不到密码怎么办 支付宝知道名字不知道姓怎么办 东西丢了从监控里找到怎么办 两人合影其中一人去世怎么办 税务登记证注销但是发票丢失怎么办 发票登报挂失后到国税还要怎么办 广州个体执照没办国税地税怎么办 身份信息被冒用注册了公司怎么办 二级建造师注册有效期过了怎么办 公司变更法人新刻法人章怎么办 个体户年报第一年忘了报怎么办