山西建设部网站,遵义市住房和城乡建设局官方网站,网页制作员厂家,重庆网站建设报价文章目录 组合模式介绍实现javarsut 组合模式
组合模式#xff08;Composite Pattern#xff09;#xff0c;又叫部分整体模式#xff0c;是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象#xff0c;用来表示部分以及整体层次。这种类型的设计… 文章目录 组合模式介绍实现javarsut 组合模式
组合模式Composite Pattern又叫部分整体模式是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象用来表示部分以及整体层次。这种类型的设计模式属于结构型模式它创建了对象组的树形结构。
这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。
介绍 意图将对象组合成树形结构以表示部分-整体的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 主要解决它在我们树型结构的问题中模糊了简单元素和复杂元素的概念客户程序可以像处理简单元素一样来处理复杂元素从而使得客户程序与复杂元素的内部结构解耦。 何时使用、 1、您想表示对象的部分-整体层次结构树形结构。 2、您希望用户忽略组合对象与单个对象的不同用户将统一地使用组合结构中的所有对象。
如何解决树枝和叶子实现统一接口树枝内部组合该接口。
应用实例
算术表达式包括操作数、操作符和另一个操作数其中另一个操作数也可以是操作数、操作符和另一个操作数。
优点 1、高层模块调用简单。 2、节点自由增加。
缺点在使用组合模式时其叶子和树枝的声明都是实现类而不是接口违反了依赖倒置原则。
使用场景部分、整体场景如树形菜单文件、文件夹的管理。
实现
我们有一个类 Employee该类被当作组合模型类。CompositePatternDemo 类使用 Employee 类来添加部门层次结构并打印所有员工,这样我们就可以实现不同的的部门进行自由组合实现不同部门之间的即插即用。
组合模式的 UML 图
java
步骤 1 创建 Employee 类该类带有 Employee 对象的列表。
Employee.java
import java.util.ArrayList;
import java.util.List;public class Employee {private String name;private String dept;private int salary;private ListEmployee subordinates;//构造函数public Employee(String name,String dept, int sal) {this.name name;this.dept dept;this.salary sal;subordinates new ArrayListEmployee();}public void add(Employee e) {subordinates.add(e);}public void remove(Employee e) {subordinates.remove(e);}public ListEmployee getSubordinates(){return subordinates;}public String toString(){return (Employee :[ Name : name , dept : dept , salary : salary ]);}
}步骤 2 使用 Employee 类来创建和打印员工的层次结构。
CompositePatternDemo.java
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);}} }
}步骤 3 执行程序输出结果为
Employee :[ Name : John, dept : CEO, salary :30000 ]
Employee :[ Name : Robert, dept : Head Sales, salary :20000 ]
Employee :[ Name : Richard, dept : Sales, salary :10000 ]
Employee :[ Name : Rob, dept : Sales, salary :10000 ]
Employee :[ Name : Michel, dept : Head Marketing, salary :20000 ]
Employee :[ Name : Laura, dept : Marketing, salary :10000 ]
Employee :[ Name : Bob, dept : Marketing, salary :10000 ]rsut
在rust中由于所有权机制组合模式中如果不使用引用的方法在组合顺序上便有所限制只能从低级的开始组合否则进行组合时便会出现所有权报错问题由于本人代码水平有限没能实现用引用实现的组合模式只能用转移所有权的方法实现。
use std::fmt;// 定义雇员
struct Employee{name:String,dept:String,sal:i32,subordinates:VecEmployee
}
// 自定义格式化
impl fmt::Display for Employee {fn fmt(self, f: mut fmt::Formatter) - std::fmt::Result {write!(f,Employee : Name{}, dept : {} ,salary : {}, self.name,self.dept,self.sal)}
}
impl Employee {fn add(mut self,e:Employee) {self.subordinates.push(e);}fn remove(mut self,e:Employee) {self.subordinates.retain(|x| {if x.name!e.name||x.depte.dept||x.sale.sal{return true;}return false;});}fn get_subordinates(self) {self.subordinates.as_ptr();}fn new(name:String,dept:String, sal:i32)-Employee{Employee { name, dept,sal,subordinates:Vec::new() }}}
fn pe(e:Employee) {println!({},e);if !e.subordinates.is_empty(){e.subordinates.iter().for_each(|x| pe(x));}}
fn main(){let mut ceoEmployee::new(String::from(John), String::from(CEO),30000);let mut head_salesEmployee::new(String::from(Robert), String::from(Head Sales),20000);let mut head_marketEmployee::new(String::from(Michel), String::from(Head Marketing),10000);let mut clerk1Employee::new(String::from(Laura), String::from(Marketing),10000);head_sales.add(head_market);head_sales.add(clerk1);ceo.add(head_sales);pe(ceo)}