热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

设计模式学习笔记9.组合模式

组合模式(CompositePattern),又叫部分整体模式,适用于把一组相似的对象当作一个单一的对戏那个。组合模式依据树形结构来组合对
  • 组合模式(Composite Pattern),又叫部分整体模式,适用于把一组相似的对象当作一个单一的对戏那个。组合模式依据树形结构来组合对象,用来表述部分遗迹整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构;

  • 这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式;

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

  • 主要解决:它在我们树形结构问题中,模糊了简单元素和复杂元素的概念,客户程序可以处理像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解偶;

  • 何时使用:

    • 1.想表示对象的部分-整体层次结构(树形结构);

    • 2.希望用户忽略组合对象与单个对象的不同,用户将统一地使用合租结构中的所有对象;

  • 如何解决:树脂和叶子实现统一接口,树枝内部组合该接口;

  • 关键代码:树枝内部组合该接口,并且含有内部属性List,里面放Component;

  • 应用实例:

    • 1.数算表达式包含操作数、操作符、和另一个操作数,其中,另一个操作符也可以是操作数、操作符、和另一个操作数;

    • 2.在Java、AWT和SWING中,对Button和Checkbox是树叶,Container是树枝;

  • 优点:

    • 1.高层模块调用简单;

    • 2.节点自由增加;

  • 缺点:

    • 在使用组合模块时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则;

  • 使用场景:

    • 部分、整体场景、如树形菜单、文件、文件夹的管理;

  • 实战:

    • 我们有一个类Employee,该类被当作组合模型类。CompositePatternDemo,我们演示类使用Employee类来添加部门层次结构,并打印所有员工;

 

package composite;import java.util.ArrayList;
import java.util.List;/*** @author yangxin_ryan*/
public class Employee {private String name;private String dept;private int salary;private List subordinates;public Employee(String name, String dept, int salary) {this.name = name;this.dept = dept;this.salary = salary;subordinates = new ArrayList();}public void add(Employee employee) {subordinates.add(employee);}public void remove(Employee employee) {subordinates.remove(employee);}public List getSubordinates() {return subordinates;}@Overridepublic String toString() {return ("Employ :[ Name : " + name + ", dept : " + dept + ", salary :" + salary + " ]");}
}

package composite;/*** @author yangxin_ryan*/
public class CompositePatternDemo {public static void main(String[] args) {Employee CEO = new Employee("John", "CEO", 30000);Employee headSales = new Employee("Robert", "Head Sales", 20000);Employee headMarketing = new Employee("Michel", "Head Marketing", 20000);Employee clerk1 = new Employee("Laura","Marketing", 10000);Employee clerk2 = new Employee("Bob","Marketing", 10000);Employee salesExecutive1 = new Employee("Richard","Sales", 10000);Employee salesExecutive2 = new Employee("Rob","Sales", 10000);CEO.add(headSales);CEO.add(headMarketing);headSales.add(salesExecutive1);headSales.add(salesExecutive2);headMarketing.add(clerk1);headMarketing.add(clerk2);System.out.println(CEO);for (Employee headEmployee : CEO.getSubordinates()) {System.out.println(headEmployee);for (Employee employee : headEmployee.getSubordinates()) {System.out.println(employee);}}}
}


推荐阅读
author-avatar
木维韵_538
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有