给我符合下面要求的Java代码,基于 Composite 设计模式设计一个办公邮件发送程序,其主要需求如下: (1) 程序中的组织单位包括学院、系、班级、学生会构成; (2) 可以以学生个人或组织单位的名义发送邮件; (3) 邮件可以发送到任何个人或组织单位。
时间: 2023-05-24 20:04:32 浏览: 39
首先我们需要定义一个抽象基类,表示组织单位:
```java
public abstract class Organization {
protected String name;
public Organization(String name) {
this.name = name;
}
public abstract void sendMail(Mail mail);
}
```
然后定义各种组织单位的子类,例如学院、系、班级、学生会:
```java
public class College extends Organization {
private List<Organization> departments;
public College(String name) {
super(name);
departments = new ArrayList<>();
}
public void addDepartment(Organization department) {
departments.add(department);
}
public void removeDepartment(Organization department) {
departments.remove(department);
}
@Override
public void sendMail(Mail mail) {
System.out.println(name + " sends a mail to " + mail.getRecipient());
for(Organization department : departments) {
department.sendMail(mail);
}
}
}
public class Department extends Organization {
private List<Organization> classes;
public Department(String name) {
super(name);
classes = new ArrayList<>();
}
public void addClass(Organization cls) {
classes.add(cls);
}
public void removeClass(Organization cls) {
classes.remove(cls);
}
@Override
public void sendMail(Mail mail) {
System.out.println(name + " sends a mail to " + mail.getRecipient());
for(Organization cls : classes) {
cls.sendMail(mail);
}
}
}
public class Class extends Organization {
private List<Organization> students;
public Class(String name) {
super(name);
students = new ArrayList<>();
}
public void addStudent(Organization student) {
students.add(student);
}
public void removeStudent(Organization student) {
students.remove(student);
}
@Override
public void sendMail(Mail mail) {
System.out.println(name + " sends a mail to " + mail.getRecipient());
for(Organization student : students) {
student.sendMail(mail);
}
}
}
public class Student extends Organization {
public Student(String name) {
super(name);
}
@Override
public void sendMail(Mail mail) {
System.out.println(name + " sends a mail to " + mail.getRecipient());
}
}
```
最后定义邮件的类:
```java
public class Mail {
private Organization sender;
private String recipient;
private String content;
public Mail(Organization sender, String recipient, String content) {
this.sender = sender;
this.recipient = recipient;
this.content = content;
}
public Organization getSender() {
return sender;
}
public String getRecipient() {
return recipient;
}
public String getContent() {
return content;
}
}
```
可以通过组合各种组织单位构建整个组织结构,然后在需要发送邮件时调用相应的组织单位的 `sendMail` 方法即可。
示例代码:
```java
public class Main {
public static void main(String[] args) {
College college = new College("College of Computer Science and Technology");
Department dept1 = new Department("Department of Software Engineering");
Department dept2 = new Department("Department of Computer Science");
college.addDepartment(dept1);
college.addDepartment(dept2);
Class cls1 = new Class("Class of SE 1");
Class cls2 = new Class("Class of SE 2");
Class cls3 = new Class("Class of CS 1");
dept1.addClass(cls1);
dept1.addClass(cls2);
dept2.addClass(cls3);
Student stu1 = new Student("Alice");
Student stu2 = new Student("Bob");
Student stu3 = new Student("Charlie");
Student stu4 = new Student("David");
cls1.addStudent(stu1);
cls1.addStudent(stu2);
cls2.addStudent(stu3);
cls3.addStudent(stu4);
Mail mail1 = new Mail(stu1, "Group of SE 2", "Hello everyone!");
Mail mail2 = new Mail(dept1, "Group of CS 1", "Meet new professor!");
Mail mail3 = new Mail(college, "All students", "Holiday notice!");
stu1.sendMail(mail1);
dept1.sendMail(mail2);
college.sendMail(mail3);
}
}
```