Пример. Сценарий. Допустим, вы пишете модуль шифрования. Это шифрование может зашифровать чистый файл, используя DES - стандарт шифрования данных. Аналогично, в системе вы можете использовать шифрование как стандарт шифрования AES - Advance. Также у вас может быть комбинация шифрования - сначала DES, затем AES. Или вы можете иметь сначала AES, затем DES.
Дискуссия. Как вы справитесь с этой ситуацией? Вы не можете продолжать создавать объект таких комбинаций - например - AES и DES - всего 4 комбинации. Таким образом, вам нужно иметь 4 отдельных объекта. Это будет усложняться по мере увеличения типа шифрования.
Решение - Продолжайте наращивать стек - комбинации в зависимости от необходимости - во время выполнения.
Еще одно преимущество этого стекового подхода заключается в том, что вы можете легко его разматывать.
Вот решение - на C ++.
Во-первых, вам нужен базовый класс - фундаментальная единица стека. Вы можете думать как основание стека. В этом примере это чистый файл. Будем всегда следовать полиморфизму. Сделайте сначала интерфейсный класс этой фундаментальной единицы. Таким образом, вы можете реализовать его как хотите. Кроме того, вам не нужно думать о зависимости при включении этого фундаментального модуля.
Вот класс интерфейса -
class IclearData
{
public:
virtual std::string getData() = 0;
virtual ~IclearData() = 0;
};
IclearData::~IclearData()
{
std::cout<<"Destructor called of IclearData"<<std::endl;
}
Теперь реализуйте этот интерфейсный класс -
class clearData:public IclearData
{
private:
std::string m_data;
clearData();
void setData(std::string data)
{
m_data = data;
}
public:
std::string getData()
{
return m_data;
}
clearData(std::string data)
{
setData(data);
}
~clearData()
{
std::cout<<"Destructor of clear Data Invoked"<<std::endl;
}
};
Теперь давайте создадим абстрактный класс декоратора - который можно расширить для создания любых разновидностей - здесь разновидность - это тип шифрования. Этот абстрактный класс декоратора относится к базовому классу. Таким образом, декоратор "является" своего рода интерфейсным классом. Таким образом, вам нужно использовать наследование.
class encryptionDecorator: public IclearData
{
protected:
IclearData *p_mclearData;
encryptionDecorator()
{
std::cout<<"Encryption Decorator Abstract class called"<<std::endl;
}
public:
std::string getData()
{
return p_mclearData->getData();
}
encryptionDecorator(IclearData *clearData)
{
p_mclearData = clearData;
}
virtual std::string showDecryptedData() = 0;
virtual ~encryptionDecorator() = 0;
};
encryptionDecorator::~encryptionDecorator()
{
std::cout<<"Encryption Decorator Destructor called"<<std::endl;
}
Теперь давайте создадим класс декоратора бетона -
Тип шифрования - AES -
const std::string aesEncrypt = "AES Encrypted ";
class aes: public encryptionDecorator
{
private:
std::string m_aesData;
aes();
public:
aes(IclearData *pClearData): m_aesData(aesEncrypt)
{
p_mclearData = pClearData;
m_aesData.append(p_mclearData->getData());
}
std::string getData()
{
return m_aesData;
}
std::string showDecryptedData(void)
{
m_aesData.erase(0,m_aesData.length());
return m_aesData;
}
};
Теперь предположим, что тип декоратора - DES -
const std :: string desEncrypt = "DES Encrypted";
class des: public encryptionDecorator
{
private:
std::string m_desData;
des();
public:
des(IclearData *pClearData): m_desData(desEncrypt)
{
p_mclearData = pClearData;
m_desData.append(p_mclearData->getData());
}
std::string getData(void)
{
return m_desData;
}
std::string showDecryptedData(void)
{
m_desData.erase(0,desEncrypt.length());
return m_desData;
}
};
Давайте создадим код клиента для использования этого класса декоратора -
int main()
{
IclearData *pData = new clearData("HELLO_CLEAR_DATA");
std::cout<<pData->getData()<<std::endl;
encryptionDecorator *pAesData = new aes(pData);
std::cout<<pAesData->getData()<<std::endl;
encryptionDecorator *pDesData = new des(pAesData);
std::cout<<pDesData->getData()<<std::endl;
/** unwind the decorator stack ***/
std::cout<<pDesData->showDecryptedData()<<std::endl;
delete pDesData;
delete pAesData;
delete pData;
return 0;
}
Вы увидите следующие результаты -
HELLO_CLEAR_DATA
Encryption Decorator Abstract class called
AES Encrypted HELLO_CLEAR_DATA
Encryption Decorator Abstract class called
DES Encrypted AES Encrypted HELLO_CLEAR_DATA
AES Encrypted HELLO_CLEAR_DATA
Encryption Decorator Destructor called
Destructor called of IclearData
Encryption Decorator Destructor called
Destructor called of IclearData
Destructor of clear Data Invoked
Destructor called of IclearData
Вот диаграмма UML - ее представление в классе. В случае, если вы хотите пропустить код и сосредоточиться на аспекте дизайна.