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");
      }
  }

  

输出:

 

posted @   ®Geovin Du Dream Park™  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
历史上的今天:
2015-09-22 sql: sq_helptext
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5
点击右上角即可分享
微信分享提示