《设计模式》组合模式---伊利工厂
喝牛奶的时候,发现袋子上面写了一大块的伊利某某分公司,嘿。今天学到组合模式。正好用用实例。来更好的理解组合模式。
伊利总工厂在内蒙古,像牛奶一类的东西保质期都不长,为了让大家喝到真正的优质牛奶,伊利就在全国添加分工厂,来满足需求。
无论是总工厂还是分工厂,都有生产和销售部门。
在组合模式中,这就能够说成是总体与部分可被一致对待的问题。
先来看看伊利工厂组合模式的代码:
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的调用就须要做出对应的推断。
这样的方式就叫做安全方式。
何时使用:需求中体现对的是部分和总体层次的结构时
希望用户能够忽略组合对象与单个对象的不同,统一使用组合中的全部对象时
优点:组合模式能够让用户一致的使用组合结构和单个对象。
《设计模式》组合模式---伊利工厂相关推荐
- 设计模式 | 组合模式及典型应用
本文的主要内容: 介绍组合模式 示例 组合模式总结 源码分析组合模式的典型应用 java.awt中的组合模式 Java集合中的组合模式 Mybatis SqlNode中的组合模式 组合模式 树形结构不 ...
- javascript设计模式-组合模式
1 <!DOCTYPE HTML> 2 <html lang="en-US"> 3 <head> 4 <meta charset=&quo ...
- 设计模式---组合模式
设计模式---组合模式 什么是组合模式:Composite? 使用场景 代码示例 组合模式模板 组合模式的安全性和透明性 总结 优缺点: 适用场景: 什么是组合模式:Composite? 计算机的文件 ...
- Java设计模式 —— 组合模式(Composite)
Java设计模式 -- 组合模式(Composite) 定义 Composite,组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性. ...
- JS设计模式--组合模式
JS设计模式–组合模式 昨天学习了白贺翔老师的JS组合模式,现在把我学到的分享出来叭O(∩_∩)O,直接看下面代码 <!DOCTYPE html> <html lang=" ...
- [Head First设计模式]生活中学设计模式——组合模式
系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式- ...
- 设计模式-组合模式(双十一组合折扣你看懂了吗)
文章目录 组合模式 Demo 组合模式 组合模式(Composite Pattern)又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层 ...
- 设计模式----组合模式UML和实现代码
2019独角兽企业重金招聘Python工程师标准>>> 一.什么是组合模式? 组合模式(Composite)定义:将对象组合成树形结构以表示'部分---整体'的层次结构.组合模式使得 ...
- 大话设计模式—组合模式
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式, ...
- java设计模式 组合_JAVA 设计模式 组合模式
用途组合模式 (Component) 将对象组合成树形结构以表示"部分-整体"的层次结构. 组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模式. 结构 ...
最新文章
- addHeaderView()异常 —— setAdapter has already been called
- 09945 oracle 解决方法_ORACLE rman与RMAN-00054ORA-09945
- 查找xml文件中某接点的值
- Android为spinner设置适配器,Android Spinner与适配器模式详解及实例代码
- Swagger如何测试Date类型参数
- matlab适应度函数ga,ga程序中适应度函数fitness function向量化问题
- 将“早期版本的Windows”改名
- 【前端教程】如何监控网页崩溃?
- 直连线和交叉线的区别
- u盘第一扇区 分区表_硬盘主引导扇区、分区表和分区引导扇区(MBR、DPT、DBR、BPB)详解...
- contiki学习笔记(五)ctimer和etimer
- 箭杆织布机计算机控制系统,高速喷水织布机单片机控制系统设计 毕业设计论文.doc...
- 凸优化学习(二)——凸集
- 融合蓝牙与IoT 拓展Wi-Fi商业价值
- 微软的软件工程现代化转型
- 以太网(802.3)帧结构 (转)
- 迅雷工作原理的推测及慎用它的理由
- 《精解Windows8》——2.12 个性化Metro界面
- IC失效分析芯片测试
- Linux上网本和XP,上网本Linux系统改装XP系统的经验分享.pdf
热门文章
- c语言字符串如何调换位置,c语言字符串从第m个位置开始复制
- 判断是否是ie浏览器 前端js_jquery判断是否为ie浏览器的方法
- javaweb java代码写在哪里_写了那么多年 Java 代码,终于 debug 到 JVM 了
- 相平衡计算matlab代码,MATLAB,气液相平衡程序,求帮忙改一下。 - 仿真模拟 - 小木虫 - 学术 科研 互动社区...
- python 生成器_Python生成器
- html教图片程,html教的程大全.pdf
- python中home定义是什么_关于python中的module你需要了解的
- 计算机网络研修培训总结,计算机培训工作总结(共10篇).doc
- 汤立波:车联网最新发展动态
- 【Vue源码】Vue中DOM的异步更新策略以及nextTick机制