设计模式-盒子装水果

给出适当的类设计和相应的代码:  有一个只能放进不能取出的盒子, 最多可放8个水果, 不一定一天放入。水果只是苹果和桔子两种, 它们放入盒子前的原始重量分别为50和30, 放入盒子后, 由于丢失水分, 它们的重量减轻, 苹果和桔子每天分别减轻4和3, 直到达到各自原始重量的3/5后, 不再减轻重量。盒子的功能有:  输出盒子中苹果的数量; 输出盒子中桔子的数量; 输出一天来盒子中水果减轻的总重量; 输出当前水果的总重量。

实现代码:

class Fruit
{
public:
    Fruit(int mMax =0,int mMin=0,int mLose = 0,int mW = 0)
        :mMaxWeight(mMax),mMinWeight(mMin),mLoseWeight(mLose),mWeigth(mW) {}
    virtual ~Fruit() {}

    virtual Fruit * Clone( ) const = 0;
    virtual int ReduceWeight( );
    virtual int  Weight( ) const;
protected:
    int   mMaxWeight;
    int   mMinWeight;
    int   mLoseWeight;
    int   mWeight;
};

int Fruit::ReduceWeight( )
{
        int newWeight = mWeight - mLoseWeight;
        if (newWeight < mMinWeight )
            newWeight = mMinWeight;
        int reduce =  mWeight - newWeight;
        mWeight = newWeight;
        return reduce;
}

int  Fruit::Weight( ) const
{
  return  mWeight;
}

class Apple:public Fruit
{
public:
    Apple():Fruit(50,50*3/5,4,50) { }
    virtual ~Apple( ) {}
    virtual Apple * Clone() const
        { return new Apple(*this); }

    // other
};

class Orange:public Fruit
{
public:
    Orange():Fruit(30,30*3/5,3,30) { }
    virtual ~Orange( ) {}
    virtual Orange * Clone() const
        { return new Orange(*this); }

    // other
};

class Box
{
public:
    Box():count(0) {for(int i=0;i<8;i++) fruit[i]=0;}
    ~Box() {for(int i=0;i<8;i++) delete fruit[i];}
    void AddFruit(Fruit& one)     //放入一个水果
    {

        if (count<8) 
          fruit[count++]=one.Clone();
    }

    int  ApplesNum() const
    {
        int num=0;
        for(int i=0;i<8;i++) {
            Apple * p=dynamic_cast<Apple *>(fruit[i]);
            if (p)
                ++num;
        }
        return num;
    }
    int  OrangesNum() const
    {
        int num=0;
        for(int i=0;i<8;i++) {
            Orange * p=dynamic_cast<Orange *>(fruit[i]);
            if(p)    
              ++num;
        }
        return num;
    }
    int  PassOneDay()  //一天来失去的总重量
    {
        int num=0;
        for(int i=0;i<8;i++)
            if(fruit[i])
                num+=fruit[i]->ReduceWeight();
        return num;
    }
    int  TotalWeight() const
    {
        int num=0;
        for(int i=0;i<8;i++)
            if(fruit[i])
                num+=fruit[i]->Weight();
        return num;
    }
    void Show() const
    {
        cout<<"盒子里共有苹果  ="<<ApplesNum()<<endl;
        cout<<"盒子里共有桔子  ="<<OrangesNum()<<endl;
        cout<<"一天来共失去重量="<<PassOneDay()<<endl;
        cout<<"当前水果的总重量="<<TotalWeight()<<endl;
        cout<<endl;
    }
private:
    Fruit * fruit[8];
    int     count;
};
int main(int argc, char* argv[])
{
    Box aBox;

    Apple a1,a2,a3;

    cout<<"第一天放入一个苹果"<<endl;
    aBox.AddFruit(a1);
    aBox.Show();

    cout<<"第二天又放入一个苹果"<<endl;
    aBox.AddFruit(a2);
    aBox.Show();

    Orange o1,o2;
    cout<<"第三天又放入两个桔子"<<endl;
    aBox.AddFruit(o1);
    aBox.AddFruit(o2);
    aBox.Show();

    cout<<"第四天又放入一个苹果"<<endl;
    aBox.AddFruit(a3);
    aBox.Show();

    return 0;
}
发布了58 篇原创文章 · 获赞 22 · 访问量 9878

猜你喜欢

转载自blog.csdn.net/zsd0819qwq/article/details/102723859