喝牛奶的时候,发现袋子上面写了一大块的伊利某某分公司,嘿。今天学到组合模式。正好用用实例。来更好的理解组合模式。

伊利总工厂在内蒙古,像牛奶一类的东西保质期都不长,为了让大家喝到真正的优质牛奶,伊利就在全国添加分工厂,来满足需求。

无论是总工厂还是分工厂,都有生产和销售部门。

在组合模式中,这就能够说成是总体与部分可被一致对待的问题。

先来看看伊利工厂组合模式的代码:

    abstract class ErieFactory   //伊利工厂类{protected string name;public ErieFactory(string name){this .name =name ;}public abstract void Add(ErieFactory F);public abstract void Remove(ErieFactory F);public abstract void Display(int depth); //显示public abstract void LineOfDuty();//履行职责}class  ConcreteFactory:ErieFactory   //详细工厂类{private List <ErieFactory >children =new List<ErieFactory> ();public ConcreteFactory (string name):base(name){}public override void Add(ErieFactory F)//添加{children .Add (F);}public override void Remove(ErieFactory F ) //移除{children .Remove (F);}public override void Display(int depth) //显示{Console .WriteLine (new string ('-',depth )+name);foreach (ErieFactory  componment in children ) {componment .Display (depth + 2);}}//履行职责public override void LineOfDuty(){foreach (ErieFactory componment in children ){componment .LineOfDuty ();}}}//生产部门class LineDepartment:ErieFactory {public LineDepartment (string name):base(name ){}public override void Add(ErieFactory F)//添加{}public override void Remove(ErieFactory F ) //移除{}public override void Display(int depth) //显示{Console .WriteLine (new string ('-',depth )+name);}//履行职责public override void LineOfDuty(){Console .WriteLine ("{0} 生产优质牛奶",name );}}//销售部门class SaleDepartment:ErieFactory {public SaleDepartment (string name):base(name ){}public override void Add(ErieFactory F)//添加{}public override void Remove(ErieFactory F ) //移除{}public override void Display(int depth) //显示{Console .WriteLine (new string ('-',depth )+name);}//履行职责public override void LineOfDuty(){Console .WriteLine ("{0} 仅仅卖优质牛奶",name );} }

代码实现中,首先定义一个抽象的伊利工厂类。定义一个详细工厂类,他继承了伊利工厂的全部方法。

client代码:

   static void Main(string[] args){ConcreteFactory root=new ConcreteFactory("伊利总工厂");root.Add (new LineDepartment ("总工厂生产部门"));root .Add (new SaleDepartment ("总工厂销售部门"));ConcreteFactory  comp=new ConcreteFactory ("上海分公司");comp .Add (new LineDepartment ("上海分公司生产部门"));comp .Add (new SaleDepartment ("上海分公司销售部门"));root .Add (comp );Console.WriteLine ("\n结构图:");root .Display (1);Console .WriteLine ("\n职责:");root.LineOfDuty ();Console .Read ();}

再来看看代码结构图:

结果显示:

通过上边的实例,对于组合模式应该有点了解了。如今再来看看组合模式。

组合模式:将对象组合成树形结构以表示“部分-总体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

   来看看组合模式的结构图:

                                    

Leaf叶子节点中加上Add和Remove是为了让Component接口的全部子类都具有Add和Remove这样做的优点就是叶节点和枝节点对外界没有差别。他们具有一致的行为接口。

但也有问题,Leaf本身没有这些方法,实现是没有意义的。

这样的方式就叫做透明方式。

        若不希望这样做,在接口Component中不声明Add和Remove方法,那么子类中的Leaf也就不须要去实现它,而在Composite声明全部用来管理子类对象的方法。这样就不会出现那个问题了,但会由于不够透明。所以树叶和树枝将不具有同样的接口,client的调用就须要做出对应的推断。

这样的方式就叫做安全方式

      何时使用:需求中体现对的是部分和总体层次的结构时

希望用户能够忽略组合对象与单个对象的不同,统一使用组合中的全部对象时

     优点:组合模式能够让用户一致的使用组合结构和单个对象。


《设计模式》组合模式---伊利工厂相关推荐

  1. 设计模式 | 组合模式及典型应用

    本文的主要内容: 介绍组合模式 示例 组合模式总结 源码分析组合模式的典型应用 java.awt中的组合模式 Java集合中的组合模式 Mybatis SqlNode中的组合模式 组合模式 树形结构不 ...

  2. javascript设计模式-组合模式

    1 <!DOCTYPE HTML> 2 <html lang="en-US"> 3 <head> 4 <meta charset=&quo ...

  3. 设计模式---组合模式

    设计模式---组合模式 什么是组合模式:Composite? 使用场景 代码示例 组合模式模板 组合模式的安全性和透明性 总结 优缺点: 适用场景: 什么是组合模式:Composite? 计算机的文件 ...

  4. Java设计模式 —— 组合模式(Composite)

    Java设计模式 -- 组合模式(Composite) 定义 Composite,组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性. ...

  5. JS设计模式--组合模式

    JS设计模式–组合模式 昨天学习了白贺翔老师的JS组合模式,现在把我学到的分享出来叭O(∩_∩)O,直接看下面代码 <!DOCTYPE html> <html lang=" ...

  6. [Head First设计模式]生活中学设计模式——组合模式

    系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式- ...

  7. 设计模式-组合模式(双十一组合折扣你看懂了吗)

    文章目录 组合模式 Demo 组合模式 组合模式(Composite Pattern)又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层 ...

  8. 设计模式----组合模式UML和实现代码

    2019独角兽企业重金招聘Python工程师标准>>> 一.什么是组合模式? 组合模式(Composite)定义:将对象组合成树形结构以表示'部分---整体'的层次结构.组合模式使得 ...

  9. 大话设计模式—组合模式

    组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式, ...

  10. java设计模式 组合_JAVA 设计模式 组合模式

    用途组合模式 (Component) 将对象组合成树形结构以表示"部分-整体"的层次结构. 组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模式. 结构 ...

最新文章

  1. addHeaderView()异常 —— setAdapter has already been called
  2. 09945 oracle 解决方法_ORACLE rman与RMAN-00054ORA-09945
  3. 查找xml文件中某接点的值
  4. Android为spinner设置适配器,Android Spinner与适配器模式详解及实例代码
  5. Swagger如何测试Date类型参数
  6. matlab适应度函数ga,ga程序中适应度函数fitness function向量化问题
  7. 将“早期版本的Windows”改名
  8. 【前端教程】如何监控网页崩溃?
  9. 直连线和交叉线的区别
  10. u盘第一扇区 分区表_硬盘主引导扇区、分区表和分区引导扇区(MBR、DPT、DBR、BPB)详解...
  11. contiki学习笔记(五)ctimer和etimer
  12. 箭杆织布机计算机控制系统,高速喷水织布机单片机控制系统设计 毕业设计论文.doc...
  13. 凸优化学习(二)——凸集
  14. 融合蓝牙与IoT 拓展Wi-Fi商业价值
  15. 微软的软件工程现代化转型
  16. 以太网(802.3)帧结构 (转)
  17. 迅雷工作原理的推测及慎用它的理由
  18. 《精解Windows8》——2.12 个性化Metro界面
  19. IC失效分析芯片测试
  20. Linux上网本和XP,上网本Linux系统改装XP系统的经验分享.pdf

热门文章

  1. c语言字符串如何调换位置,c语言字符串从第m个位置开始复制
  2. 判断是否是ie浏览器 前端js_jquery判断是否为ie浏览器的方法
  3. javaweb java代码写在哪里_写了那么多年 Java 代码,终于 debug 到 JVM 了
  4. 相平衡计算matlab代码,MATLAB,气液相平衡程序,求帮忙改一下。 - 仿真模拟 - 小木虫 - 学术 科研 互动社区...
  5. python 生成器_Python生成器
  6. html教图片程,html教的程大全.pdf
  7. python中home定义是什么_关于python中的module你需要了解的
  8. 计算机网络研修培训总结,计算机培训工作总结(共10篇).doc
  9. 汤立波:车联网最新发展动态
  10. 【Vue源码】Vue中DOM的异步更新策略以及nextTick机制