组合模式

javascript设计模式-组合模式(6)

微笑、不失礼 提交于 2019-11-26 23:05:59
组合模式是一种专门为创建Web上的动态用户界面而量身制定的模式。使用这种模式可以用一条命令在多个对象上激发复杂的或递归的行为。这可以简化粘贴性代码,使其更容易维护,而那些复杂行为则被委托给各个对象 传统的层级业务场景 /* * 场景模拟: * -> 公司 * -> 财务部门 * -> 张一 * -> 张二 * -> 张三 * -> 销售部门 * -> 张四 * -> 张五 * -> 张六 * * 实际的任务具体是落实到人上去实施的 也就是说只有人才具有具体的方法实现 * */ var Org = function (name) { this .name = name ; this .depts = [] ; }; Org.prototype = { constructor:Org , addDepts: function (child) { this .depts.push(child); return this ; } , getDepts: function () { return this .depts; } }; var Dept = function (name) { this .name = name ; this .persons = [] ; }; Dept.prototype = { constructor:Dept , addPersons: function

Javascript设计模式-14-组合模式

拜拜、爱过 提交于 2019-11-26 23:04:40
Javascript设计模式-14-组合模式 简介 在程序设计中华,有一些和 ‘事物是由相似的子事物构成’类似的思想,组合模式就是用小的子对象来构建更大的对象,而这些小的子对象本身也许是由更小的“孙对象”构成 用途 组合模式将对象组合成树形结构,以表示部分整体的层次,通过对象的多态性表现,使得用户对单个对象和组合对象的使用具有一致性 请求在树中传递的过程 请求会沿着树形结构从请求其实节点向下传递,直到树的尽头 // 目录类 var Folder = function (name) { this .name = name; this .parent = null ; this .files = []; } // 目录下添加文件或者文件夹 Folder.prototype.add = function (file) { file.parent = this ; // 指定父节点 this .files.push(file); } // 扫描 Folder.prototype.scan = function () { var parentName = ( this .parent && this .parent.name) || '' ; console.log( '扫描文件夹:' , parentName + '-' + this .name); // 将扫描命令向下传递 var

设计模式之GOF23组合模式

别等时光非礼了梦想. 提交于 2019-11-26 22:53:59
组合模式Composite 使用组合模式的场景 :把部分和整体的关系用树形结构表示,从而使客户端可以使用统一的方式处理对象和整体对象(文件和文件夹) 组合模式核心 : -抽象构件(Component)角色:定义了叶子和容器的共同点 -叶子(Leaf)构件角色:无子节点 -容器(Composite)构件角色:有容器特征:可以包含子节点或者其他容器 例如杀毒软件: public abstract class File { protected String name; abstract void killVirus();//杀毒 public File(String name) { this.name = name; } } class ImageFile extends File{ public ImageFile(String name) { super(name); } public void killVirus() { System.out.println("对图片"+this.name+".jpg进行杀毒"); } } class TextFile extends File{ public TextFile(String name) { super(name); } public void killVirus() { System.out.println("对文本"+this

结构型模式(三) 组合模式(Composite Pattern)

五迷三道 提交于 2019-11-26 12:56:24
动机(Motivate) 客户代码过多地依赖于对象容器(对象容器是对象的容器,细细评味)复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁变化,带来了代码的维护性、扩展性等方面的弊端。如何将“客户代码与复杂的对象容器结构”解耦?如何让对象容器自己来实现自身的复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂的对象容器? 意图(Intent) 将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。 —— 《设计模式》GoF 结构图(Structure) 模式的组成 组合模式中涉及到三个角色: (1)、抽象构件角色(Component) :这是一个抽象角色,它给参加组合的对象定义出了公共的接口及默认行为,可以用来管理所有的子对象(在透明式的组合模式是这样的)。在安全式的组合模式里,构件角色并不定义出管理子对象的方法,这一定义由树枝结构对象给出。 (2)、树叶构件角色(Leaf) :树叶对象是没有下级子对象的对象,定义出参加组合的原始对象的行为。(原始对象的行为可以理解为没有容器对象管理子对象的方法,或者 【原始对象行为】+【管理子对象的行为(Add,Remove等)】=面对客户代码的接口行为集合) (3)、树枝构件角色(Composite) :代表参加组合的有下级子对象的对象

组合模式

旧城冷巷雨未停 提交于 2019-11-26 11:04:39
定义:也叫部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示部分-整体的关系,使用户对单个对象和组合对象具有一致的访问型 优: 1.客户端可以一致的处理单个对象和组合对象,无需关心处理的是单个还是组合,简化了客户端代码 2.加入新对象,不影响原有的代码,满足开闭原则 缺: 1.设计复杂,客户端需花费大量时间理清关系 2.不容易限制容器的构件 3.不容易用继承的方法来增加构建的新功能 结构: 1.抽象构件(component):为树叶构件和树枝构件声明公共接口,并实现他们的默认行为,在透明式的组合模式中抽象构件还声明访问和管理子类的接口,在安全的组合模式中,不声明访问和管理子类的接口,管理工作由树枝构件完成 2.树叶构件(leaf):是组合中叶节点对象,他没有子节点,用于实现抽象构件角色中声明的公共接口 3.树枝构件(composite):是组合中的分支节点对象,它有子节点,他实现了抽象构件角色中声明的接口,它的主要作用是存储和管理子部件。通常包含Add(),Remove(),GetChild()等方法 模式: 1.透明方式:由于抽象构件声明了所有子类的全部方法,所以客户端无需区别树叶对象和树枝对象,对客户端来说是透明的,但其缺点是:树叶构件本来没有Add(),Remove(),GetChild()等方法,却要实现他们(空实现或抛异常),这样会带来安全性问题 2

设计模式之组合模式

可紊 提交于 2019-11-25 19:16:02
组合模式用于表示具有层次结构的数据,使得我们对单个对象和组合对象的访问具有一致性。 直接看一个例子吧,每个员工都有姓名、部门、薪水这些属性,同时还有下属员工集合(虽然可能集合为空),而下属员工和自己的结构是一样的,也有姓名、部门这些属性,同时也有他们的下属员工集合。 public class Employee { private String name; private String dept; private int salary; private List<Employee> subordinates; // 下属 public Employee(String name,String dept, int sal) { this.name = name; this.dept = dept; this.salary = sal; subordinates = new ArrayList<Employee>(); } public void add(Employee e) { subordinates.add(e); } public void remove(Employee e) { subordinates.remove(e); } public List<Employee> getSubordinates(){ return subordinates; } public