设计模式-组合模式

某教育机构组织结构如下图所示:


在该教育机构的OA系统中可以给各级办公室下发公文,试采用组合模式设计该机构的组织结构,绘制相应的类图并编程模拟实现,在客户端代码中模拟下发公文。

 类图:


实现代码:

抽象构件类OrganizationComponent 

package CompositePattern2;

 

public class OrganizationComponent {

 

    private String name;

 

    public String getName() {

        return this.name;

    }

 

 

    public void setName(String newName) {

        this.name = newName;

    }

 

 

    public void addComponent(OrganizationComponent organizationComponent) {

 

    }

 

 

    public void removeComponent(OrganizationComponent organizationComponent) {

 

    }

 

 

    public OrganizationComponent getChild(int i) {

 

        return null;

    }

 

 

    public void sendMessage(String msg) {

 

    }

 

 

    public void onMessage() {

 

    }

 

}

叶子构件类Office 

package CompositePattern2;

 

public class Office extends OrganizationComponent {

 

    private String name;

 

 

    public String getName() {

 

        return this.name;

    }

 

 

    public void setName(String newName) {

 

        this.name=newName;

    }

 

 

    public void addComponent(OrganizationComponent organizationComponent) {

 

        System.out.println("error method");

    }

 

 

    public void removeComponent(OrganizationComponent organizationComponent) {

 

        System.out.println("error method");

    }

 

 

    public OrganizationComponent getChild(int i) {

 

        System.out.println("error method");

        return null;

    }

 

 

    public void sendMessage(String msg) {

 

        System.out.println("error method");

    }

 

 

    public void onMessage() {

 

        System.out.println(this.getName()+"接收公文");

    }

 

}


容器构件类DeptComponent 

package CompositePattern2;

 

import java.util.HashSet;

import java.util.Set;

 

public class DeptComponent extends OrganizationComponent {

 

    public Set<OrganizationComponent> organizationCompoent = new HashSet<>();


    private String name;


    public String getName() {

 

        return this.name;

    }

 

 

    public void setName(String newName) {

 

        this.name = newName;

    }

 

 

    public void addComponent(OrganizationComponent organizationComponent) {

 

        organizationCompoent.add(organizationComponent);

    }

 

 

    public void removeComponent(OrganizationComponent organizationComponent) {

 

        organizationCompoent.remove(organizationComponent);

    }

 

 

    public OrganizationComponent getChild(int i) {

 

        System.out.println("获取子代元素");


        return null;

    }

 

 

    public void sendMessage(String msg) {

 

        System.out.println(this.getName()+"发送公文");


        for (OrganizationComponent oc:organizationCompoent) {


            if (oc instanceof DeptComponent){


                oc.sendMessage(msg);


            }else if (oc instanceof Office){


                oc.onMessage();

            }

        }

    }

 

 

    public void onMessage() {

 

        System.out.println("错误方法");

    }

 

}


客户端类Client 

package CompositePattern2;

 

public class Client {

        public static void main(String[] args) {

            OrganizationComponent beijing = new DeptComponent();

            beijing.setName("北京总部");

            OrganizationComponent jiaowuOffice1 = new Office();

            jiaowuOffice1.setName("教务办公室1");

            OrganizationComponent hunanfenxiao = new DeptComponent();

            hunanfenxiao.setName("湖南分校");

            OrganizationComponent xingzhengOffice = new Office();

            xingzhengOffice.setName("行政办公室1");

 

            OrganizationComponent jiaowuOffice2 = new Office();

            jiaowuOffice2.setName("教务办公室2");

 

            OrganizationComponent changshaJiaoxuediao = new DeptComponent();

            changshaJiaoxuediao.setName("长沙教学点");

            OrganizationComponent xiangtanjiaoxuedian = new DeptComponent();

            xiangtanjiaoxuedian.setName("湘潭教学点");

            OrganizationComponent xingzhengOffice2 = new Office();

            xingzhengOffice2.setName("行政办公室2");

            OrganizationComponent jiaowuOffice3 = new Office();

            jiaowuOffice3.setName("教务办公室3");

            OrganizationComponent xingzhengOffice3 = new Office();

            xingzhengOffice3.setName("行政办公室3");

            OrganizationComponent jiaowuOffice4 = new Office();

            jiaowuOffice4.setName("教务办公室4");

            OrganizationComponent xingzhengOffice4 = new Office();

            xingzhengOffice4.setName("行政办公室4");


            beijing.addComponent(jiaowuOffice1);

            beijing.addComponent(hunanfenxiao);

            beijing.addComponent(xingzhengOffice);

 

            hunanfenxiao.addComponent(jiaowuOffice2);

            hunanfenxiao.addComponent(changshaJiaoxuediao);

            hunanfenxiao.addComponent(xiangtanjiaoxuedian);

            hunanfenxiao.addComponent(xingzhengOffice2);

 

            changshaJiaoxuediao.addComponent(jiaowuOffice3);

            changshaJiaoxuediao.addComponent(xingzhengOffice3);

 

            xiangtanjiaoxuedian.addComponent(jiaowuOffice4);

            xiangtanjiaoxuedian.addComponent(xingzhengOffice4);

 

            beijing.sendMessage("北京总部发送公文");

            System.out.println("----------------------");

            xiangtanjiaoxuedian.sendMessage("发送公文");

 

        }

    }

 

 


  • 9
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值