某教育机构组织结构如下图所示:
在该教育机构的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()+"接收公文"); }
} 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("发送公文");
} }
|