六. 组合模式

本文介绍如何运用组合模式设计一个教育机构的组织结构,包括抽象的Branch类、AdOffice和EdOffice子类,以及Branch类的子节点管理和公文传递功能。通过XML配置文件动态加载实例,展示了在客户端发送公文的过程。
摘要由CSDN通过智能技术生成

一.内容说明

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

二.设计类图

在这里插入图片描述

三.全部类代码

package compositepattern;

public abstract class AbstractBranch {
	 public abstract void receiveDoc();
	 public abstract String getName();
public void setName(String name) {}
}

public class AdOffice extends AbstractBranch{
	 private String name;
	 public void receiveDoc() {
		 System.out.println("行政办公室收到文件");
	 }
	
	 public AdOffice(String name) {
		 this.name = name;
	 }
	
	 public String getName() {
		 return name;
	 }
}

public class EdOffice extends AbstractBranch{
	 private String name;
	 public void receiveDoc() {
		 System.out.println("教务办公室收到文件");
	 }
	
	 public EdOffice(String name) {
		 this.name = name;
	 }
	
	 public String getName() {
		 return name;
	 }
}

import java.util.ArrayList;
public class Branch extends AbstractBranch{
private ArrayList<AbstractBranch>list;
private String name;
	 public Branch(String name) {
		 this.name = name;
	 }
	 public void receiveDoc() {
		 System.out.println(name+"收到文件");
	 }
	 public AbstractBranch getChild(int n) {
	 	 return list.get(n);
	 }
	 public void add(AbstractBranch abBranch) {
		 list.add(abBranch);
	 }
	 public void remove(AbstractBranch abBranch) {
		 list.remove(abBranch);
	 }
	 public String getName() {
		 return name;
	 }
	 public void sendDoc(AbstractBranch abBranch) {
		 System.out.println(name+ "发送文件到"+abBranch.getName());
		 abBranch.receiveDoc();
	 }  
}

首先设计一个AbstractBranch类,用于访问和管理子部件,里面有两个抽象方法ReceiveDoc()和getName(),然后设计两个子类AdOffice,EdOffice去实现父类的方法,其次再设计一个有枝结点类Branch继承AbstractBranch类,里面不但包含实现父类的方法,而且有增加和删除结点的add()和remove()方法。最后设计一个XMLUilt类去获取.xml配置文件中的具体类名并返回一个实例对象。

客户类:

public class Client {

	 public static void main(String[] args) {
		
		 AbstractBranch ab1 = (AbstractBranch) XMLUtil.getBean();
	     ab1.setName("行政办公室");
	     AbstractBranch ab2 = (AbstractBranch) XMLUtil.getBean();
	     ab2.setName("教务办公室");
	     Branch b1 = (Branch)XMLUtil.getBean();
	     b1.setName("北京总部");
	     Branch b2 = (Branch)XMLUtil.getBean();
	     b2.setName("湖南分校");
	     Branch b3 = (Branch)XMLUtil.getBean();
	     b3.setName("长沙教学点");
	     Branch b4 = (Branch)XMLUtil.getBean();
	     b4.setName("湘潭教学点");
	     b1.sendDoc(b2);
	     b2.sendDoc(b3);
	     b2.sendDoc(b4);
	     b3.sendDoc(ab1);
	     b4.sendDoc(ab2);	
	 }

XMLUtil类:

import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;
public class XMLUtil {
     //该方法用于配置从XML配置文件中提取具体类名,并返回一个实例对象
	 public static Object getBean() {
		 try {
			  //创建DOM文档对象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
			 DocumentBuilder builder = dFactory.newDocumentBuilder();
			 Document doc;
			 doc = builder.parse(new File("src/compositepattern/NewFile.xml"));
			 //获取包含类名的文本节点
			 NodeList n1 = doc.getElementsByTagName("className");
			 Node classNode = n1.item(0).getFirstChild();
			 String cName = classNode.getNodeValue();
			 //通过类名生成实例对象并将其返回
			 Class c = Class.forName(cName);
			 Object obj = c.newInstance();
			 return obj;
		 }catch(Exception e) {
			 e.printStackTrace();
			 return null;
		 }
	 }
}

xml配置文件:

<?xml version="1.0"?>
<config>
     <className>compositepattern.Branch</className>
</config>

四.运行结果

在这里插入图片描述

五.分析和总结

1.整体构造:
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

2.优点:
(1) 可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,使得增加新构件也更容易。
(2)客户端调用简单,客户端可以一致的使用组合结构或其中单个对象。
(3)定义了包含叶子对象和容器对象的类层次结构,叶子对象可以被组合成更复杂的容器对象,而这个容器对象又可以被组合,这样不断递归下去,可以形成复杂的树形结构。
(4)更容易在组合体内加入对象构件,客户端不必因为加入了新的对象构件而更改原有代码。

3.缺点:
使设计变得更加抽象,对象的业务规则如果很复杂,则实现组合模式具有很大挑战性,而且不是所有的方法都与叶子对象子类都有关联。

  • 2
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
实验一 单例模式的应用 1 实验目的 1) 掌握单例模式(Singleton)的特点 2) 分析具体问题,使用单例模式进行设计。 2 实验内容和要求 很多应用项目都有配置文件,这些配置文件里面定义一些应用需要的参数数据。 通常客户端使用这个类是通过new一个AppConfig的实例来得到一个操作配置文件内容 的对象。如果在系统运行,有很多地方都需要使用配置文件的内容,系统会同时存 在多份配置文件的内容,这会严重浪费内存资源。 事实上,对于AppConfig类,在运行期间,只需要一个对象实例就够了。那么应该怎 么实现呢?用C#控制台应用程序实现该单例模式。绘制该模式的UML。 3 模式结构图 4 UML类 5 代码 6运行结果 实验二 工厂模式的应用 1 实验目的 1) 掌握工厂模式(Factory)的特点 2) 分析具体问题,使用工厂模式进行设计。 2 实验内容和要求 有一个OEM制造商代理做HP笔记本电脑(Laptop),后来该制造商得到了更多的品牌笔 记本电脑的订单Acer,Lenovo,Dell,该OEM商发现,如果一次同时做很多个牌子的本本 ,有些不利于管理。利用工厂模式改善设计,用C#控制台应用程序实现该OEM制造商的工 厂模式。绘制该模式的UML。 3 模式结构图 4 UML类 5 代码 6运行结果 实验三 抽象工厂模式的应用 1 实验目的 1) 掌握抽象工厂模式(Abstract Factory)的特点 2) 分析具体问题,使用抽象工厂模式进行设计。 2 实验内容和要求 麦当劳(McDonalds)和肯德基(KFC)快餐店都经营汉堡(Hamburg)和可乐(Cola ),用C#控制台应用程序实现这两个快餐店经营产品的抽象工厂模式。绘制该模式的UM L。 3 模式结构图 4 UML类 5代码 6运行结果 df 实验四 建造者模式的应用 1 实验目的 1) 掌握建造者模式(Builder)的特点 2) 分析具体问题,使用建造者模式进行设计。 2 实验内容和要求 建造者模式是一种创建型模式,它主要是应对项目一些复杂对象的创建工作。所谓 "复杂对象",是指此对象还含有其它的子对象。我们现在定义一个场景:汽车生产必 须包含车轮(Wheel)、油箱(OilBox)和车身(Body),应用建造者模式,用C#控制台应用程 序实现该设计,构建BMW品牌和BenZ品牌汽车生产。绘制该模式的UML。 3 模式结构图 4 UML类 5代码 6运行结果 实验五 适配器模式的应用 1 实验目的 1) 掌握适配器模式(Adapter)的特点 2) 分析具体问题,使用适配器模式进行设计。 2 实验内容和要求 一个软件团队开发绘系统,设计了圆对象(Circle)、矩形对象(Rectangle),线对 象(Line)都支持Draw()函数,即可以通过Draw()函数绘制形。为了加快项目进度,将 角度对象(Angle)绘制功能交给了合作团队实现。但合作团队将角度对象绘制函数定为了 DrawAngle()。绘系统提供给用户后,用户不满意,希望能统一的调用,不用记太多命 令。应用适配器模式,用C#控制台应用程序完善该设计。绘制该模式的UML。 3模式结构图 4 UML类 5 代码 6运行结果 实验 桥接模式的应用 1 实验目的 1) 掌握桥接模式(Bridge)的特点 2) 分析具体问题,使用桥接模式进行设计。 2 实验内容和要求 一个咖啡店可以提供大杯(JorumCoffee)、杯(MediumCoffee)、小杯(SmallCoffee )的咖啡(Coffee),为了满足不同用户的口味,在咖啡可以添加牛奶(Milk),或者糖( Sugar),或者柠檬(Lemon),提供给用户不同口味的组合,如大杯咖啡加牛奶,杯咖啡 加糖,小杯咖啡加柠檬,小杯咖啡加糖等。应用桥接模式,用C#控制台应用程序实现该 设计。绘制该模式的UML。 3 模式结构图 4 UML类 5 代码 6 运行结果 实验七 装饰模式的应用 1 实验目的 1) 掌握装饰模式(Decorator)的特点 2) 分析具体问题,使用装饰模式进行设计。 2 实验内容和要求 "喜羊羊逃命"游戏:喜羊羊被灰太狼追,喜羊羊最多5条命,灰太狼每咬到喜羊羊一 次,喜羊羊就要少一条命。在逃的过程喜羊羊可以吃到三种苹果,吃"红苹果"可以给 喜羊羊加上保护罩,吃"绿苹果"可以加快喜羊羊奔跑速度,吃"黄苹果"可以使喜羊羊趟 着水跑。应用装饰模式,用C#控制台应用程序实现该设计。绘制该模式的UML。 提示:这个例子如果用类的继承来实现的话那可就麻烦了,你需要为喜羊羊派生3*2 *1=6个子类(有保护罩的喜羊羊,奔跑速度加快的喜羊羊,会趟水的喜羊羊,既有保护 罩又会趟水的喜
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值