软件设计模式之享元模式实验
一、实验目的
掌握软件设计模式中的组合模式,能够用组合模式编写程序,解决实际问题。
二、实验内容与要求
内容:以学校的部门结构为场景,用组合模式进行模拟,程序设计语言可自由选择。
要求:需要用“文字+代码+截图”的形式对实验的主要代码和运行结果进行展示和描述。
三、实验方法
需求:一个学校包含多个学院,一个学院包含多个部门,部门是最下面一级,不能包含其他子节点,即部门是叶子节点,我们需要展示学校的整个组织架构树结构;
- 抽象构建类
package com.combined.java;
/**
*
* @Description
* @author ChuanShun.Wang Email:[email protected]
* @version
* @date 2020年3月24日下午8:43:30
*
*/
public abstract class SchoolSectorStructure{
private String name;
public SchoolSectorStructure (String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
protected void add(SchoolSectorStructure component) {
}
protected void delete(SchoolSectorStructure component) {
}
public abstract void print();
}
```java
- 子容器类:学校类
package com.combined.java;
import java.util.ArrayList;
import java.util.List;
public class School extends SchoolSectorStructure {
private List< SchoolSectorStructure > components = new ArrayList<>();
public School(String name) {
super(name);
}
@Override
protected void add(SchoolSectorStructure component) {
components.add(component);
}
@Override
protected void delete(SchoolSectorStructure component) {
components.remove(component);
}
//输出学校里面的所有学院
@Override
public void print() {
for (SchoolSectorStructure component : components) {
component.print();
}
}
}
- 子容器:学院类
package com.combined.java;
import java.util.ArrayList;
import java.util.List;
public class College extends SchoolSectorStructure {
/**
* 存在部门信息
*/
private List< SchoolSectorStructure > components = new ArrayList<>();
public College(String name) {
super(name);
}
@Override
protected void add(SchoolSectorStructure component) {
components.add(component);
}
@Override
protected void delete(SchoolSectorStructure component) {
components.remove(component);
}
@Override
public void print() {
for (SchoolSectorStructure t : components) {
t.print();
}
}
}
4.叶子节点:部门类
package com.combined.java;
public class Department extends SchoolSectorStructure {
public Department(String name) {
super(name);
}
@Override
protected void add(SchoolSectorStructure component) {
System.out.println("不支持该方法...");
}
@Override
protected void delete(SchoolSectorStructure component) {
System.out.println("不支持该方法...");
}
@Override
public void print() {
System.out.println(getName());
}
}
```java
6.客户端类
package com.combined.java;
public class Client {
public static void main(String[] args) {
//学校
SchoolSectorStructure university = new School("信阳师范学院");
//学院里面添加多个部门
SchoolSectorStructure college1 = new College("计算机学院");
college1.add(new Department("计算机与信息技术专业"));
college1.add(new Department("软件工程专业"));
SchoolSectorStructure college2 = new College("数学院");
college2.add(new Department("应用数学专业"));
college2.add(new Department("统计学专业"));
//学校里面添加多个学院
university.add(college1);
university.add(college2);
System.out.println("====" + university.getName() + "====");
university.print();
System.out.println("====" + college1.getName() + "====");
college1.print();
System.out.println("====" + college2.getName() + "====");
college2.print();
}
}
四 、实验结果
-
结果展示
-
客户端使用的时候不需要区分当前是子容器对象还是叶子节点,都采用一致的方式调用,这样极大地方便客户端的调用。
-
增加新的子容器节点和叶子节点都挺方便,不需要对原有代码进行改造,符合开闭原则。
-
通过叶子节点和子容器节点的递归组合可以形成复杂的树形结构数据,但对于树形结构的控制却很简单。
-
如果叶子节点和子容器之间差异比较大,那么不太适合使用组合模式。