java的复合设计模式

时间:2020-02-23 14:34:45  来源:igfitidea点击:

复合设计模式允许我们拥有树结构并询问树结构中的每个节点以执行任务。

我们可以采取真实的举例的组织。
它有总经理和综合经理,可以有经理和管理者可以有开发人员.Now你可以设置树结构并询问每个节点,如GotsAlary()这样的常用操作。

如gof所描述的:"将对象撰写到树结构中以表示零件整个Hierarchies.Composite允许客户端处理单个对象和对象的组成"。

复合设计模式以两种方式处理每个节点或者叶子.Composite意味着它可以在其下方有其他物体.Leaf意味着它没有下面的物体。

何时使用它:

  • 我们想代表对象的一部分整体的Hierachies。
  • 我们希望客户端能够忽略对象和单个对象的组成之间的差异.Clients将均匀地对待复合结构中的所有对象。

元素:

  • 零件
  • 声明组合中对象的接口。
  • 同样地实现所有类通用的接口的deaukt行为。
  • 声明用于访问和管理其子组件的接口。
  • 叶子
  • 代表组合物中的叶对象。叶没有孩子。
  • 定义构图中的原始对象的行为。
  • 合成的
  • 定义具有子子组件的行为。
  • 存储子组件。
  • 实现组件接口中的子相关操作。
  • 客户
  • 通过组件接口操纵组合物中的对象。

工作流程:

客户端使用组件类接口与组合结构中的对象进行交互。
如果收件人是一个叶子,则请求直接处理。
如果收件人是一个复合,那么它通常将请求转发给其子组件,可能在转发之前和之后执行其他操作。

递归:

是什么让复合模式最美丽的是递归的力量。
我可以用同一个组织的例子解释这个。
我们想找到为组织所有员工支付的总薪资。
只不过是首席执行官的工资+支付给所有部门的薪水。
部门的薪水是多少?
这是部门负责人的薪水+所有项目的工资。
项目的总工资是多少?
它是项目经理的工资+所有项目成员的薪水。
简而言之,任何东西的薪水都是自我薪水+所有子组的薪水。

例子:

在一个小组织中,有5名员工。
最重要的位置,有1个总经理。
总经理,有两名员工,一个是经理,另一个是开发人员,另外经理有两个在他下面工作的开发人员。
我们想打印所有员工的名称和薪水从上到下。

树结构例如:

UML图表以外的示例:

与上述通用元素进行比较。
按示例包括以下元素。

  • 经理(复合材料)
  • 开发人员(叶)
  • 员工(组件)

所有上面的java代码:

首先,我们将创建Component Inrteface.it表示构成中的对象。
它具有所有公共操作将适用于Manager和Developer。

员工.java(组件):

package org.arpit.javapostsforlearning.designpatterns;
 
public interface Employee {
 
     public void add(Employee employee);
     public void remove(Employee employee);
     public Employee getChild(int i);
     public String getName();
     public double getSalary();
     public void print();
}

现在我们将创建经理(复合类).Key Point,这里的所有常用方法都将其操作委托给Child Objects.it具有访问和修改其子项的方法。

Manager.java(综合):

package org.arpit.javapostsforlearning.designpatterns;
 
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
 
public class Manager implements Employee{
 
 private String name;
 private double salary;
 
 public Manager(String name,double salary){
  this.name = name;
  this.salary = salary;
 }
 
 List employees = new ArrayList();
 public void add(Employee employee) {
    employees.add(employee);
 }
 
 public Employee getChild(int i) {
  return employees.get(i);
 }
 
 public String getName() {
  return name;
 }
 
 public double getSalary() {
  return salary;
 }
 
 public void print() {
  System.out.println("-------------");
  System.out.println("Name ="+getName());
  System.out.println("Salary ="+getSalary());
  System.out.println("-------------");
  
  Iterator employeeIterator = employees.iterator();
    while(employeeIterator.hasNext()){
     Employee employee = employeeIterator.next();
     employee.print();
    }
 }
 
 public void remove(Employee employee) {
  employees.remove(employee);
 }
 
}

我们将创建Developer类。
此类是叶节点,因此与访问子相关的所有操作将是空的,因为它没有孩子。

developer.java(叶):

package org.arpit.javapostsforlearning.designpatterns;
/**
 * In this class,there are many methods which are not applicable to developer because
 * it is a leaf node.
 */
 
public class Developer implements Employee{
 
    private String name;
    private double salary;
 
    public Developer(String name,double salary){
        this.name = name;
        this.salary = salary;
    }
    public void add(Employee employee) {
        //this is leaf node so this method is not applicable to this class.
    }
 
    public Employee getChild(int i) {
        //this is leaf node so this method is not applicable to this class.
        return null;
    }
 
    public String getName() {
        return name;
    }
 
    public double getSalary() {
        return salary;
    }
 
    public void print() {
        System.out.println("-------------");
        System.out.println("Name ="+getName());
        System.out.println("Salary ="+getSalary());
        System.out.println("-------------");
    }
 
    public void remove(Employee employee) {
        //this is leaf node so this method is not applicable to this class.
    }
 
}

compositedesignpatternmain.java:

package org.arpit.javapostsforlearning.designpatterns;
 
public class CompositeDesignPatternMain {
 
 public static void main(String[] args) {
  Employee emp1=new Developer("John", 10000);
  Employee emp2=new Developer("David", 15000);
  Employee manager1=new Manager("Daniel",25000);
  manager1.add(emp1);
  manager1.add(emp2);
  Employee emp3=new Developer("Michael", 20000);
  Manager generalManager=new Manager("Mark", 50000);
  generalManager.add(emp3);
  generalManager.add(manager1);
  generalManager.print();
 }
}

输出:

------------
Name =Mark
Salary =50000.0
------------
------------
Name =Michael
Salary =20000.0
------------
------------
Name =Daniel
Salary =25000.0
------------
------------
Name =John
Salary =10000.0
------------
------------
Name =David
Salary =15000.0
------------

缺点:

  • 一旦定义了树结构,就会将绿色设计变得过于一般。
  • 叶类必须创建一些必须为空的方法。

在JDK中的用法:

  • java.util.map #putall(MAP)
  • java.util.list#addall(集合)
  • java.util.set#addall(集合)
  • java.nio.bytebuffer #plod(bytebuffer)(也可以在Charbuffer,ShortBuffer,Intbuffer,LongBuffer,Floatbuffer和DoubleBuffer)
  • java.awt.conontainer#添加(组件)