设计模式之组合模式简单例题

1、理解结构型模式的概念及作用

2、掌握组合模式的概念及使用

题目:

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

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

类图:

类图说明:

AbstractSchool:抽象类,是实现所有类共有的接口默认行为。用于访问和管理子部件。

ClassRoom:叶子节点,表示教务办公室,实现getWrite()方法,表示下发通知。

WorkRoom:叶子节点,表示行政办公室,实现getWrite()方法,表示下发通知。

Folder:容器,可以添加新的叶子节点,并继续在叶子节点里实现方法。

Client:具体的客户端测试类。

代码:

AbstractSchool:抽象类

public abstract class AbstractSchool {
    public abstract void add(AbstractSchool room);

    public abstract void remove(AbstractSchool room);

    public abstract void getWrite();
}

ClassRoom:叶子节点,表示教务办公室

public class ClassRoom extends AbstractSchool {
    private String name;

    public ClassRoom(String name) {
        this.name = name;
    }

    @Override
    public void getWrite() {
        System.out.println("-----" + name + "下发了公文");
    }

    @Override
    public void add(AbstractSchool room) {
        System.out.println("不支持该方法");
    }

    @Override
    public void remove(AbstractSchool room) {
        System.out.println("不支持该方法");
    }

WorkRoom:叶子节点,表示行政办公室

public class WorkRoom extends AbstractSchool{
    private String name;

    public WorkRoom(String name) {
        this.name = name;
    }

    @Override
    public void getWrite() {
        System.out.println("-----" + name + "下发了公文");
    }

    @Override
    public void add(AbstractSchool room) {
        System.out.println("不支持该方法");
    }

    @Override
    public void remove(AbstractSchool room) {
        System.out.println("不支持该方法");
    }

}

Folder:容器

import java.util.ArrayList;


public class Folder extends AbstractSchool {
    private ArrayList<AbstractSchool> list = new ArrayList<AbstractSchool>();
    private String name;

    public Folder(String name) {
        this.name = name;
    }

    @Override
    public void add(AbstractSchool room) {
        list.add(room);
    }

    @Override
    public void remove(AbstractSchool room) {
        list.remove(room);
    }


    @Override
    public void getWrite() {
        System.out.println("*****对" + name + "进行下发公文");
        for (Object obj : list) {
            ((AbstractSchool) obj).getWrite();
        }
    }
}

Client:具体的客户端测试类

public class Client {
    public static void main(String[] args) {
        AbstractSchool folderBeijing, folderHunan, folderChangsha, folderXiangtan, C1, W1, C2, W2, C3, W3, C4, W4;

        folderBeijing = new Folder("北京总部");
        folderHunan=new Folder("湖南分校");
        folderChangsha=new Folder("长沙教学点");
        folderXiangtan=new Folder("湘潭教学点");

        C1=new ClassRoom("北京总部的教学办公室");
        W1=new WorkRoom("北京总部的行政办公室");
        C2=new ClassRoom("湖南分校的教学办公室");
        W2=new WorkRoom("湖南分校的行政办公室");
        C3=new ClassRoom("长沙教学点的教学办公室");
        W3=new WorkRoom("长沙教学点的行政办公室");
        C4=new ClassRoom("湘潭教学点的教学办公室");
        W4=new WorkRoom("湘潭教学点的行政办公室");

        folderBeijing.add(C1);
        folderBeijing.add(W1);
        folderBeijing.add(folderHunan);

        folderHunan.add(C2);
        folderHunan.add(W2);
        folderHunan.add(folderChangsha);
        folderHunan.add(folderXiangtan);

        folderChangsha.add(C3);
        folderChangsha.add(W3);
        folderXiangtan.add(C4);
        folderXiangtan.add(W4);

        folderBeijing.getWrite();
    }
}

运行结果:

以上为我学习过程中所着手的一个简单实验,可供参考。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值