六. 组合模式

一.内容说明

某教育机构组织结构如下图所示:
在这里插入图片描述
在该教育机构的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.缺点:
使设计变得更加抽象,对象的业务规则如果很复杂,则实现组合模式具有很大挑战性,而且不是所有的方法都与叶子对象子类都有关联。

  • 1
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 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个子类(有保护罩的喜羊羊,奔跑速度加快的喜羊羊,会趟水的喜羊羊,既有保护 罩又会趟水的喜
针对23种设计模式,分别写了demo并画了类帮助理解。 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。 二、设计模式大原则 1、开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计我们会提到这点。 2、里氏代换原则(Liskov Substitution Principle) 里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。—— From Baidu 百科 3、依赖倒转原则(Dependence Inversion Principle) 这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。 4、接口隔离原则(Interface Segregation Principle) 这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文多次出现:降低依赖,降低耦合。 5、迪米特法则(最少知道原则)(Demeter Principle) 为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。 6、合成复用原则(Composite Reuse Principle) 原则是尽量使用合成/聚合的方式,而不是使用继承。
共150讲,时长共 33小时18分钟 1) 优秀的程序应该是这样的:阅读时,感觉很优雅;新增功能时,感觉很轻松;运行时,感觉很快速,这就需要设计模式支撑。 2) 设计模式包含了大量的编程思想,讲授和真正掌握并不容易,网上的设计模式课程不少,大多讲解的比较晦涩,没有真实的应用场景和框架源码支撑,学习后,只知其形,不知其神。就会造成这样结果: 知道各种设计模式,但是不知道怎么使用到真实项目。本课程针对上述问题,有针对性的进行了升级 (1) 授课方式采用 解+框架源码分析的方式,让课程生动有趣好理解 (2) 系统全面的讲解了设计模式,包括 设计模式七大原则、UML类-类的大关系、23种设计模式及其分类,比如 单例模式的8种实现方式、工厂模式的3种实现方式、适配器模式的3种实现、代理模式的3种方式、深拷贝等 3) 如果你想写出规范、漂亮的程序,就花时间来学习下设计模式吧 课程内容和目标 本课程是使用Java来讲解设计模式,考虑到设计模式比较抽象,授课采用 解+框架源码分析的方式 1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括:创建型模式:单例模式(8种实现)、抽象工厂模式、原型模式、建造者模式、工厂模式。结构型模式:适配器模式(3种实现)、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式(3种实现)。行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式) 2) 学习目标:通过学习,学员能掌握主流设计模式,规范编程风格,提高优化程序结构和效率的能力
设计模式是一种解决软件设计问题的可重用方案,通过使用6个不同的设计模式,我们可以完成一个绘系统C。 1. 单例模式:使用单例模式来确保系统只有一个绘系统C的实例。这样可以避免多次实例化和占用过多资源。 2. 工厂模式:使用工厂模式来创建形对象。根据用户的输入,工厂模式可以根据特定的参数创建不同类型的形对象,例如线条、圆形或矩形。 3. 观察者模式:使用观察者模式来实现形的选功能。当用户选择一个形时,观察者模式可以通知其他相关对象响应用户的选择动作。 4. 命令模式:使用命令模式来实现撤销和重做功能。用户的每个操作都可以封装成一个命令对象,在需要撤销或者重做时,可以通过调用命令对象进行相应的操作。 5. 组合模式:使用组合模式来管理形对象的层次结构。形系统C可以由多个形对象组成,而组合模式可以帮助我们以树形结构的方式组织和管理这些形对象。 6. 迭代器模式:使用迭代器模式来遍历形对象集合。通过实现迭代器接口,可以简化形对象的遍历过程,使得用户可以方便地对形对象集合进行访问和操作。 通过使用以上个不同的设计模式,我们可以实现一个功能强大且易于扩展的绘系统C。这些设计模式可以提高系统的灵活性和可维护性,并且可以将不同的功能模块解耦,使得系统更易于修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值