#include <iostream>
#include <type_traits>
class Originator{
typedef int * pStateType;
using rStateType =
typename ::std::remove_pointer< pStateType >::type;
private:
pStateType pState;
public:
Originator( const rStateType& o )
:pState( new rStateType {o} ) {}
Originator( pStateType const p )
:pState( p ) {}
explicit
Originator( const Originator& other )
: pState( new rStateType { *(other.pState)} ) { }
Originator( Originator&& other )
: pState ( &*(other.pState) )
{ other.pState = nullptr; }
public:
class Memento{
private:
Originator::pStateType pState;
public:
Memento( const Originator& O)
:pState( new Originator::rStateType { *(O.pState) } )
{}
public:
Memento( void ) = delete;
explicit Memento( const Originator::pStateType& ) = delete;
Memento( const Memento& ) = default;
Memento( Memento&& other )
: pState( &*(other.pState) )
{ puts("Memento::&& constor called..."); }
Originator::rStateType GetState( void ) const
{ return *pState; }
~Memento( void )
{ puts("Memento::detor called..."); }
};
public:
Memento CreateMemento( void ){
return Memento( *this );
}
void SetMemento( const Memento& M ){
pState = new rStateType { M.GetState() };
}
void SetState( const rStateType& o ){
if( pState ) delete pState;
pState = new rStateType {o};
}
rStateType GetState( void ) const
{ return *pState; }
};
int main( void ){
Originator origin( 100 );
std::cout << origin.GetState() << std::endl;
puts("-----------------------------------");
Originator::Memento mem = std::move( origin.CreateMemento() );
origin.SetState( 1000 );
std::cout << origin.GetState() << std::endl;
puts("-----------------------------------");
origin.SetMemento( mem );
std::cout << origin.GetState() << std::endl;
puts("-----------------------------------");
return 0;
}
【设计模式:memento pattern】
于 2024-02-02 17:58:52 首次发布