CSharp: Composite Pattern
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | /// <summary> /// Summary description for AbstractEmployee. /// 20220918 /// geovindu,Geovin Du,涂聚文 ///Composite Patterns 组合模式 /// /// </summary> public interface AbstractEmployee { /// <summary> /// get current salary /// </summary> /// <returns></returns> float getSalary(); /// <summary> /// get name /// </summary> /// <returns></returns> string getName(); /// <summary> /// true if leaf /// </summary> /// <returns></returns> bool isLeaf(); /// <summary> /// add subordinate /// </summary> /// <param name="nm"></param> /// <param name="salary"></param> void add( string nm, float salary); /// <summary> /// add subordinate /// </summary> /// <param name="emp"></param> void add(AbstractEmployee emp); /// <summary> /// get subordinates /// </summary> /// <returns></returns> IEnumerator getSubordinates(); /// <summary> /// get child /// </summary> /// <returns></returns> AbstractEmployee getChild(); /// <summary> /// get salaries of all /// </summary> /// <returns></returns> float getSalaries(); /// <summary> /// get Boss /// </summary> /// <returns></returns> AbstractEmployee getBoss(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | /// <summary> /// Summary description for EmpNode. /// 20220918 /// geovindu,Geovin Du,涂聚文 ///Composite Patterns 组合模式 /// </summary> public class Employee : AbstractEmployee { protected float salary; protected string name; protected AbstractEmployee parent; protected ArrayList subordinates; /// <summary> /// /// </summary> /// <param name="parnt"></param> /// <param name="nm"></param> /// <param name="salry"></param> public Employee(AbstractEmployee parnt, string nm, float salry) { subordinates = new ArrayList(); name = nm; salary = salry; parent = parnt; } /// <summary> /// /// </summary> /// <returns></returns> public AbstractEmployee getBoss() { return parent; } /// <summary> /// /// </summary> /// <returns></returns> public float getSalary() { return salary; } /// <summary> /// /// </summary> /// <returns></returns> public string getName() { return name; } /// <summary> /// /// </summary> /// <returns></returns> public bool isLeaf() { return subordinates.Count == 0; } /// <summary> /// /// </summary> /// <param name="nm"></param> /// <param name="salary"></param> public virtual void add( string nm, float salary) { throw new Exception( "No subordinates in base employee class" ); } /// <summary> /// /// </summary> /// <param name="emp"></param> public virtual void add(AbstractEmployee emp) { throw new Exception( "No subordinates in base employee class" ); } /// <summary> /// /// </summary> /// <returns></returns> public IEnumerator getSubordinates() { return subordinates.GetEnumerator(); } public virtual AbstractEmployee getChild() { return null ; } /// <summary> /// /// </summary> /// <returns></returns> public float getSalaries() { float sum; AbstractEmployee esub; //get the salaries of the boss and subordinates sum = getSalary(); IEnumerator enumSub = subordinates.GetEnumerator(); while (enumSub.MoveNext()) { esub = (AbstractEmployee)enumSub.Current; sum += esub.getSalaries(); } return sum; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | /// <summary> /// Summary description for Boss. /// 20220918 /// geovindu,Geovin Du,涂聚文 ///Composite Patterns 组合模式 /// </summary> public class Boss : Employee { /// <summary> /// /// </summary> /// <param name="parnt"></param> /// <param name="name"></param> /// <param name="salary"></param> public Boss(AbstractEmployee parnt, string name, float salary) : base (parnt, name, salary) { } /// <summary> /// /// </summary> /// <param name="parnt"></param> /// <param name="emp"></param> public Boss(AbstractEmployee parnt, AbstractEmployee emp) : base (parnt, emp.getName(), emp.getSalary()) { } /// <summary> /// /// </summary> /// <param name="nm"></param> /// <param name="salary"></param> public override void add( string nm, float salary) { AbstractEmployee emp = new Employee( this , nm, salary); subordinates.Add(emp); } /// <summary> /// /// </summary> /// <param name="emp"></param> public override void add(AbstractEmployee emp) { subordinates.Add(emp); } /// <summary> /// /// </summary> /// <returns></returns> public override AbstractEmployee getChild() { bool found; AbstractEmployee tEmp = null ; IEnumerator esub; if (getName().Equals(getName())) return this ; else { found = false ; esub = subordinates.GetEnumerator(); while (!found && esub.MoveNext()) { tEmp = (AbstractEmployee)esub.Current; found = (tEmp.getName().Equals(name)); if (!found) { if (!tEmp.isLeaf()) { tEmp = tEmp.getChild(); found = (tEmp.getName().Equals(name)); } } } if (found) return tEmp; else return new Employee( null , "New person" , 0); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | /// <summary> /// Summary description for EmpNode. /// 20220918 /// geovindu,Geovin Du,涂聚文 ///Composite Patterns 组合模式 /// </summary> public class EmpNode : TreeNode { private AbstractEmployee emp; /// <summary> /// /// </summary> /// <param name="aemp"></param> public EmpNode(AbstractEmployee aemp) : base (aemp.getName()) { emp = aemp; } /// <summary> /// /// </summary> /// <returns></returns> public AbstractEmployee getEmployee() { return emp; } } |
窗体调用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 | /// <summary> /// 20220918 /// geovindu,Geovin Du,涂聚文 ///Composite Patterns 组合模式 /// </summary> public partial class CompositePatternsForm : Form { AbstractEmployee prez, marketVP, salesMgr; TreeNode rootNode; AbstractEmployee advMgr, emp, prodVP, prodMgr, shipMgr; /// <summary> /// /// </summary> private Random rand; /// <summary> /// /// </summary> private void init() { rand = new Random(); buildEmployeeList(); buildTree(); } /// <summary> /// /// </summary> private void buildEmployeeList() { prez = new Boss( null , "CEO" , 200000); marketVP = new Boss(prez, "Marketing VP" , 100000); prez.add(marketVP); salesMgr = new Boss(marketVP, "Sales Mgr" , 50000); advMgr = new Boss(marketVP, "Advt Mgr" , 50000); marketVP.add(salesMgr); marketVP.add(advMgr); prodVP = new Boss(prez, "Production VP" , 100000); prez.add(prodVP); advMgr.add( "Secy" , 20000); //add salesmen reporting to sales manager for ( int i = 1; i <= 5; i++) { salesMgr.add( "Sales" + i.ToString(), rand_sal(30000)); } prodMgr = new Boss(prodVP, "Prod Mgr" , 40000); shipMgr = new Boss(prodVP, "Ship Mgr" , 35000); prodVP.add(prodMgr); prodVP.add(shipMgr); for ( int i = 1; i <= 3; i++) { shipMgr.add( "Ship" + i.ToString(), rand_sal(25000)); } for ( int i = 1; i <= 4; i++) { prodMgr.add( "Manuf" + i.ToString(), rand_sal(20000)); } } /// <summary> /// /// </summary> private void buildTree() { EmpNode nod; nod = new EmpNode(prez); rootNode = nod; EmpTree.Nodes.Add(nod); addNodes(nod, prez); } /// <summary> /// /// </summary> /// <param name="node"></param> private void getNodeSum(EmpNode node) { AbstractEmployee emp; float sum; emp = node.getEmployee(); sum = emp.getSalaries(); lbSalary.Text = sum.ToString(); } /// <summary> /// /// </summary> /// <param name="nod"></param> /// <param name="emp"></param> private void addNodes(EmpNode nod, AbstractEmployee emp) { AbstractEmployee newEmp; EmpNode newNode; IEnumerator empEnum; empEnum = emp.getSubordinates(); while (empEnum.MoveNext()) { newEmp = (AbstractEmployee)empEnum.Current; newNode = new EmpNode(newEmp); nod.Nodes.Add(newNode); addNodes(newNode, newEmp); } } /// <summary> /// /// </summary> /// <param name="sal"></param> /// <returns></returns> private float rand_sal( float sal) { float rnum = rand.Next(); rnum = rnum / Int32.MaxValue; return rnum * sal / 5 + sal; } /// <summary> /// /// </summary> public CompositePatternsForm() { InitializeComponent(); init(); } /// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void CompositePatternsForm_Load( object sender, EventArgs e) { } /// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void EmpTree_AfterSelect( object sender, TreeViewEventArgs e) { EmpNode node; node = (EmpNode)EmpTree.SelectedNode; getNodeSum(node); } /// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btShowBoss_Click( object sender, EventArgs e) { EmpNode node; node = (EmpNode)EmpTree.SelectedNode; AbstractEmployee emp = node.getEmployee(); string bosses = "" ; while (emp != null ) { bosses += emp.getName() + "\n" ; emp = emp.getBoss(); } MessageBox.Show( null , bosses, "Reporting chain" ); } } |
输出:
哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)
分类:
CSharp code
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
2015-09-22 sql: sq_helptext