设计模式--结构型模式--享元模式

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <iostream>

using namespace std;
//Structural Patterns--Flyweight
//结构型模式--享元模式

//Flyweight(抽象享元类):通常是一个抽象类,在抽象享元类中声明了具体享元类公共的方法,这些方法可以向外界提供享元对象的内部数据(内部状态),同时也可以通过这些方法来设置外部数据(外部状态)。
//ConcreteFlyweight(具体享元类):实现了抽象享元类,其实例称为享元对象;在具体享元类中为内部状态提供了存储空间。通常可以结合单例模式来设计具体享元类,为每一个具体享元类提供唯一的享元对象。
//UnsharedConcreteFlyweight(非共享具体享元类):并不是所有抽象享元类的子类都需要被共享,不能被共享的子类可设计为非共享具体享元类,当需要一个非共享具体享元类的对象时可以直接通过实例化创建。
//FlyweightFactory(享元工厂类):用于创建并管理享元对象,它针对抽象享元类编程,将各种类型的具体享元对象存储在一个享元池中,享元池一般设计为一个存储“键值对”的集合(也可以是其他类型的集合),
//    可以结合工厂模式进行设计;当用户请求一个具体享元对象时,享元工厂提供一个存储在享元池中已创建的实例或者创建一个新的实例(如果不存在的话),返回新创建的实例并将其存储在享元池中。

enum MoneyCategory    //类别,内在标识,做为标识码
{
    Coin,
    bankNote
};
enum FaceValue    //面值,外部标识,需要存储的对象
{
    ValueOne = 1,
    ValueTwo
};

class Money    //Flyweight(抽象享元类)
{
public:
    Money(MoneyCategory cate):m_cate(cate){}
    virtual ~Money(){cout << "~Money()" << endl;}
    virtual void save() = 0;
private:
    MoneyCategory m_cate;
};

class MoneyCoin : public Money    //ConcreteFlyweight(具体享元类)
{
public:
    MoneyCoin(MoneyCategory cate):Money(cate){}
    ~MoneyCoin(){cout<<"~MoneyCoin()"<<endl;}
    void save(){cout << "save coin." << endl;}
};

class MoneyNote : public Money    //ConcreteFlyweight(具体享元类)
{
public:
    MoneyNote(MoneyCategory cate):Money(cate){}
    ~MoneyNote(){cout << "~MoneyNote()" << endl;}
    void save(){cout << "save note." << endl;}
};

class bank    //FlyweightFactory(享元工厂类)
{
public:
    bank():m_coin(NULL),m_note(NULL){}
    ~bank()
    {
        if(m_coin != NULL){delete m_coin ; m_coin = NULL;}
        if(m_note != NULL){delete m_note ; m_note = NULL;}
    }
    void saveMoney(MoneyCategory cate , FaceValue value)
    {
        switch(cate)
        {
        case Coin:
            if(m_coin == NULL){m_coin = new MoneyCoin(cate);}
            m_coin->save();
            m_vector.push_back(value);
            break;
        case bankNote:
            if(m_note == NULL){m_note = new MoneyNote(cate);}
            m_note->save();
            m_vector.push_back(value);
            break;
        default:
            break;
        }
    }
    int sumSave()
    {
        int count = 0;
        for(auto iter = m_vector.begin(); iter != m_vector.end() ; iter++)
        {
            count += *iter;
        }

        return count;

    }
private:
    std::vector<FaceValue> m_vector;
    Money *m_coin;
    Money *m_note;
};

//-------------------------------------------
//测试
void dpFlyweihtTestMain()
{
    bank bn;
    bn.saveMoney(Coin , ValueOne);
    bn.saveMoney(Coin , ValueTwo);
    bn.saveMoney(bankNote , ValueOne);
    bn.saveMoney(bankNote , ValueTwo);
    
    cout << bn.sumSave() << endl;

    return;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值