题目:    根据公司业务要求﹐需要开发一个染房染机生产控制的类﹐该类包含所有染机目前的状态及染布的数据﹐所有的数据5分钟对外公布一次﹔开发两个显示数据的类分别提供给不同的用户看﹐不同用户所关心的数据不同﹐可能连显示用户有界面也不同﹐而且以后可能需要开发另外一个类来显示数据(不能改变染房染机生产控制类的代码)﹐请分别设计前三个类。注﹕不需要注意问题的细节﹐关键是实现程序的结构﹐自定义类的名字。请大家讨论下,最好能给出程序的代码,谢谢!

解决方案 »

  1.   

    基於角色的類,建議 lz 看看  ASP.NET Portal Starter Kit,裡面有詳盡的介紹和實現。
      

  2.   

    考设计模式下班回家尝试写写看。====CSDN 小助手 V2.5 2005年11月05日发布====
    CSDN小助手是一款脱离浏览器也可以访问Csdn论坛的软件
    界面:http://blog.csdn.net/Qqwwee_Com/archive/2005/11/05/523395.aspx
    下载:http://szlawbook.com/csdnv2
      

  3.   

    class 生产控制类

      public void 染机状态(..){;}
      public void 染布数据(..)
         
    }abstart class 显示数据抽象类
    {
     生产控制类 生产控制类=new 生产控制类
     public void 计算显示数据(..){;}}
    class 显示数据类A:显示数据抽象类
    {
      
      public void 计算显示数据(..){;}}class 显示数据类B:显示数据抽象类
    {
     public void 计算显示数据(..){;}}.....class 显示数据类N:显示数据抽象类
    {
     public void 计算显示数据(..){;}}
    class 显示数据工厂类
    {
      public 显示数据类A getinstanceA(..){;}
      public 显示数据类B getinstanceB(..){;}
      ... 
      public 显示数据类N getinstanceN(..){;}
    }class 显示用户界面
    {
      
       public void 显示用户界面(..)
       { 
         显示数据抽象类=显示数据工厂类.getinstanceA();
         do with......
       }
    }
      

  4.   

    不好意思,改一下:class 生产控制类

      public void 染机状态(..){;}
      public void 染布数据(..){;}
         
    }abstart class 显示数据抽象类
    {
     生产控制类 生产控制类=new 生产控制类
     public void 计算显示数据(..){;}}
    class 显示数据类A:显示数据抽象类
    {
      
      public override  void 计算显示数据(..){;}}class 显示数据类B:显示数据抽象类
    {
     public override  void 计算显示数据(..){;}}.....class 显示数据类N:显示数据抽象类
    {
     public override void 计算显示数据(..){;}}
    class 显示数据工厂类
    {
      public 显示数据类A getinstanceA(..){;}
      public 显示数据类B getinstanceB(..){;}
      ... 
      public 显示数据类N getinstanceN(..){;}
    }class 显示用户界面
    {
      
       public void 显示用户界面(..)
       { 
         显示数据抽象类=显示数据工厂类.getinstanceA();
         do with......
       }
    }
      

  5.   

    那个染房染机生产控制的类里定义一个事件就行了,通过事件来传递要公布的数据
    伪代码如下:
    public class DataEventArgs:EventArgs
    {
       将要发送的数据存储于此;
    }
    public delegate void dataPass(object sender,DataEventArgs args);
    public class 染机生产控制类
    {
       public event dataPass dataPassEvent;
       定义一个定时器;
       public void 定时器每隔五秒的回调函数
       {
          获得所有要发送的数据;
          将要发送的数据存储在DataEventArgs中;
          if(dataPassEvent!=null)
          {
             dataPassEvent(this,DataEventArgs);
          }
       }
    }
    public class 显示数据类1
    {
       public 染机生产控制类 control  = new 染机生产控制类();
       public 显示数据类1()
       {
         control.dataPassEvent += new dataPassEvent(数据显示函数);
       }
       public static void 数据显示函数
       {
         根据用户角色显示数据;
       }
    }
    public class 显示数据类2
    {
       public 染机生产控制类 control  = new 染机生产控制类();
       public 显示数据类1()
       {
         control.dataPassEvent += new dataPassEvent(数据显示函数);
       }
       public static void 数据显示函数
       {
         根据用户角色显示数据;
       }
    }
    大概是这样了,以上只是写出了意思,有些函数名字实在记不清了
      

  6.   

    ByWangler(冰凌) 的方法在顯示不同界面時恐怕會有很多重復代碼吧,  不知道樓主說的界面不同指的是什麼意思,如果僅僅是顏色或者位置變化,即通常的換膚;如果同一個界面上連元素都不一樣,那就更加復雜了。
      

  7.   

    ByWangler(冰凌) 的方法够用了
    但如果考虑这个题简化下也可考虑单一工厂模式
    即一个显示工厂显示所有的数据类.
      

  8.   

    同意定义事件.
    在生产控制类里面定义事件,在namespace里面定义数据的格式(struct? class?都可以)。
    生产控制类只管把数据以定义好的格式定时抛出
    显示类只不过是对数据格式的一个解释而已,定义出interface,然后根据不同的需要实现具体的操作
      

  9.   

    ByWangler(冰凌)的哪个是简单工厂,在增加新的数据显示类时要修改工厂代码
      

  10.   


    今天看了下《设计模式》这应该考得是涉及模式中的观察者(observer)模式吧。
    在C#中通过代表和事件好像也可以实现observer模式。
    所以 HopeInDark(子弹) 的代码应该可以达到要求。 ByWangler(冰凌) 的工厂模式不知能否达到要求,大家发表下意见呀。
      

  11.   


    ByWangler(冰凌) 的方法在顯示不同界面時恐怕會有很多重復代碼吧,  不知道樓主說的界面不同指的是什麼意思,如果僅僅是顏色或者位置變化,即通常的換膚;如果同一個界面上連元素都不一樣,那就更加復雜了。应该是显示不同的数据,可能生产人员关心的是明显数据,而老板关心的是汇总数据.具体怎么显示应该不用考虑.而且也不用实现具体显示的代码.
      

  12.   

    楼上的都是垃圾设计,既然人家说3个类,那我就3个类。
    public class 生产控制类

      public ArrayList 染机编号数组;
      public ArrayList 染布编号数组;  public bool 染机状态(染机编号){;}
      public DataTable 染机状态(染机编号数组){;}  public DataRow 染布数据(染布编号){;}
      public DataTable 染布数据(染布编号数组){;}
    }public class 显示染布数据类:生产控制类
    {
       private string userid;
       public  string Userid;
       {
         set{userid=value;}
       }
       switch(Userid)
       {
         case "1":
         染布编号数组=value2;
         break;
         ......
       }
       UI=染布数据(染布编号数组);
    }
    public class 显示染机数据类:生产控制类
    {
       private string userid;
       public  string Userid;
       {
         set{userid=value;}
       }
       switch(Userid)
       {
         case "1":
         染机编号数组=value2;
         break;
         ......
       }
       UI=染机状态(染机编号数组);
    }
      

  13.   

    我也来试试class Produce_Control{                                   //染房染机生产控制的类
                struct Machine_Status{...};                         //染机状态属性
                struct Product_Statistics{...};                     //染布数据属性
        public: Produce_Control();
                ~Produce_Control();
                void Statistics_Publish(float time_number);         //数据公布,参数为公布间隔时间
        protect: Machine_Status Status(int machine_number);         //染机状态生成方法,参数为染机编号
                 Product_Statistics Statistics(int product_number); //染布数据生成方法,参数为染布编号
     };
     class Show1 : public Produce_Control{
                void Show1_Interface();                      //显示用户1的界面 
        public: Show1();
                ~Show1();
                void Show1_Statistics();                     //显示用户1的数据
     };
     class Show2 : public Produce_Control{
                void Show2_Interface();                      //显示用户2的界面 
        public: Show2();
                ~Show2();
                void Show2_Statistics();                     //显示用户2的数据
     };
      

  14.   

    为什么都不从drivenTest开始?
    呵呵
      

  15.   

    IS_LL(风翼天翔) :
    你的鸟代码简直是le se
      

  16.   

    public abstract class a
    {
    public abstract string ShowDataAA();
    public abstract string ShowDataBB();
    public abstract string ShowDataCC();
    }
    public class AA : A
    {
    public override string ShowDataAA();
    }public class BB : A
    {
    public override string ShowDataBB();
    }小儿科,和设计模式有关系嘛???????????????????不要注重细节呀
      

  17.   

    public abstract class A
    {
    public abstract string ShowDataAA();
    public abstract string ShowDataBB();
    public abstract string ShowDataCC();
    }
    public class AA : A
    {
    public override string ShowDataAA();
    }public class BB : A
    {
    public override string ShowDataBB();
    }小儿科,和设计模式有关系嘛???????????????????不要注重细节呀
      

  18.   

    public abstract class A
    {
    public abstract string ShowData();
    }
    public class AA : A
    {
    public override string ShowData();
    }public class BB : A
    {
    public override string ShowData();
    }这样可能更好一点.
      

  19.   

    IS_LL(风翼天翔)的代码比较搞笑。
     koenemy()  的代码似乎跟对需求理解得不够全面。
    ByWangler(冰凌) 的生产控制类在每一种显示的实力里面有重复
    我菜鸟,在冰凌的基础上瞎改改
    class 生产控制类

      public void 染机状态(..){;}
      public void 染布数据(..){;}
         
    }abstart class 显示数据抽象类
    {
     
     public void 计算显示数据(生产控制类 的引用){;}}
    class 显示数据类A:显示数据抽象类
    {
      
      public override  void 计算显示数据(生产控制类 的引用){;}}class 显示数据类B:显示数据抽象类
    {
     public override  void 计算显示数据(生产控制类 的引用){;}}.....class 显示数据类N:显示数据抽象类
    {
     public override void 计算显示数据(生产控制类 的引用){;}}
    class 显示数据工厂类
    {
      生产控制类 生产控制=new 生产控制类
      public 显示数据类A getinstanceA(..){return new 显示数据类A(生产控制);}
      public 显示数据类B getinstanceB(..){;}
      ... 
      public 显示数据类N getinstanceN(..){;}
    }class 显示用户界面
    {
      
       public void 显示用户界面(..)
       { 
         显示数据抽象类=显示数据工厂类.getinstanceA();
         do with......
       }
    }
    首先说偶菜鸟,大家不要b4我。主要是针对代码重复的地方作的修改,采用组合的方式(参数)来搞定,同时也体现了显示数据类对生产控制类的参数依赖(这些名词都是上课学来的……)
      

  20.   

    class 生产控制类

      构造函数(){this.start();}
      public void start(){ //启动一个线程每隔5分钟更新一次数据 }
      public 容器 染机状态;
      public 容器 染布数据;
         
    }abstart class 显示数据抽象类
    {
     
     public void 计算显示数据(生产控制类 的引用){;}}
    class 显示数据类A:显示数据抽象类
    {
      
      public override  void 计算显示数据(生产控制类 的引用){;}}class 显示数据类B:显示数据抽象类
    {
     public override  void 计算显示数据(生产控制类 的引用){;}}.....class 显示数据类N:显示数据抽象类
    {
     public override void 计算显示数据(生产控制类 的引用){;}}
    class 显示数据工厂类
    {
      生产控制类 生产控制=new 生产控制类
      public 显示数据类A getinstanceA(..){return new 显示数据类A(生产控制);}
      public 显示数据类B getinstanceB(..){;}
      ... 
      public 显示数据类N getinstanceN(..){;}
    }class 显示用户界面
    {
      
       public void 显示用户界面(..)
       { 
         显示数据抽象类=显示数据工厂类.getinstanceA();
         do with......
       }
    }
    补充一下我的想法,刚才忘了5分钟一次那个东西了~
      

  21.   

    smalllixin(myfox) 你的代码有问题,请注意要求
    <所有的数据5分钟对外公布一次>,这说明类是主动发布数据,而不是每5分钟采样一次后被动的等别人来取数据.所以类中应该编一个事件.
    还是那句话:我认为"生产控制的类"中定时事件和静态变量是它的关键.
      

  22.   

    wxy0401(abc) :
    >>smalllixin(myfox) 你的代码有问题,请注意要求
    >><所有的数据5分钟对外公布一次>,这说明类是主动发布数据,而不是每5分钟采样一次后被动的>>等别人来取数据.所以类中应该编一个事件.
    >>还是那句话:我认为"生产控制的类"中定时事件和静态变量是它的关键.每五分钟发一个通知再让客户端来取数据行不行?
    这里有两种发布数据的方式,一种是PUSH,一种是PULL,两种方式的优缺点已经在observer模式中讨论的很清楚了,所以没必要抠字眼