[디자인 모델] 다른 사람 을 위해 웨딩드레스 - 대리 모델 을 만든다.

개술
        정의: 프 록 시 모드 (Proxy) 는 다른 대상 에 게 대역 이나 자리 표시 자 를 제공 하여 이 대상 에 대한 접근 을 제어 합 니 다. 쉽게 말 하면 한 대상 으로 다른 대상 을 대표 하 는 것 입 니 다.         
역할: 이 대상 에 대한 접근 을 제어 하기 위해 다른 대상 에 게 에이 전 트 를 제공 합 니 다.어떤 경우 에 한 대상 이 다른 대상 을 원 하지 않 거나 직접 인용 할 수 없 으 며 대리 대상 은 클 라 이언 트 에 있 을 수 있 습 니 다.
목표 대상 과 중개 역할 을 하 다.
        사상: 추가 적 인 처리 나 다른 조작 을 제공 하기 위해 실제 대상 과 호출 자 사이 에 대리 대상 을 삽입 합 니 다.이런 추가 작업 은 통상 적 으로 실제 대상 과 통신 을 해 야 한다.
 
        원 격 (Remote) 에이전트: 서로 다른 주소 공간 에 있 는 대상 에 게 국 역 대표 대상 을 제공 합 니 다.이 서로 다른 주소 공간 은 이 기계 에 있 을 수도 있 지만 다른 기계 에 있 을 수도 있다.원 격 대 리 는 대사 (Ambassador) 라 고도 부른다.장점 은 시스템 이 네트워크 의 세부 사항 을 숨 길 수 있어 서 클 라 이언 트 가 네트워크 의 존 재 를 고려 할 필요 가 없다 는 것 이다.고객 은 대리 대상 이 원 격 이 아니 라 국 역 이 라 고 생각 할 수 있 고 대리 대상 은 대부분의 네트워크 통신 업 무 를 맡 았 다.고객 이 시간 을 소모 하 는 원 격 호출 을 시작 할 것 이라는 것 을 의식 하지 못 할 수도 있 기 때문에 고객 은 필요 한 사상 적 준비 가 없다.
        가상 (Virtual) 에이전트 (그림 이 불 러 오 는 것 을 지연 시 키 는 예): 필요 에 따라 자원 소모 가 큰 대상 을 만 들 고 이 대상 을 필요 할 때 만 만 만 들 수 있 습 니 다.가상 프 록 시 모드 를 사용 하 는 장점 은 프 록 시 대상 이 필요 할 때 만 프 록 시 대상 을 불 러 올 수 있다 는 것 이다.에이 전 트 는 불 러 오 는 과정 에 필요 한 최 적 화 를 가 할 수 있다.한 모듈 의 로드 가 자원 을 매우 소모 하 는 상황 에서 가상 에이전트 의 장점 이 매우 뚜렷 하 다.
       Copy - on - WRite 에이전트: 가상 에이전트 의 일종 입 니 다.복제 (복제) 를 클 라 이언 트 가 필요 로 할 때 만 진정 으로 행동 할 수 있 도록 미루다.
        스마트 참조 (Smart Reference) 에이전트: 대상 이 인 용 될 때 이 대상 이 호출 된 횟수 를 기록 하 는 등 추가 적 인 작업 을 제공 합 니 다.
 
 
예시
         묘사: 탁 가 이 는 다이 에 게 이 교 교 에 게 선물 을 주 고 이 교 교 를 추구한다.
 
        1) 반찬 1 판 코드
               단점: 탁 가 이 는 직접 선물 류 를 행사 해 제목 에 맞지 않 는 다.
 
#include <iostream> 

class SchoolGirl //      
{
public:
	void SetName(std::string str)//   
	{
		m_Name = str;
	};

	std::string GetName(void) //       
	{
		return m_Name;
	};
private:
	std::string m_Name;
};

class Pursuit//      
{
public:
	Pursuit(SchoolGirl* mm)
	{
		m_mm = mm;
	};

	void GiveDolls()
	{
		std::cout << m_mm->GetName() << "     " << std::endl;
	};
	
	void GiveFlower()
	{
		std::cout << m_mm->GetName() << "    " << std::endl;
	};

	void GiveChocolate()
	{
		std::cout << m_mm->GetName() << "     " << std::endl;
	};
private:
	SchoolGirl* m_mm;
};

int main()
{
	SchoolGirl* jiaojiao = new SchoolGirl();//          
	jiaojiao->SetName("   ");
	
	//            
	Pursuit* zhuojiayi = new Pursuit(jiaojiao);
	zhuojiayi->GiveChocolate();
	zhuojiayi->GiveDolls();
	zhuojiayi->GiveFlower();

	delete jiaojiao;
	delete zhuojiayi;
	return 0;
}

               2) 반찬 대행 2 판
                  단점: 자신 이 직접 추구 하 라 는 것 도 아니 고 제목 에 맞지 않 는 다.
 
#include <iostream> 

class SchoolGirl //      
{
public:
	void SetName(std::string str)//   
	{
		m_Name = str;
	};

	std::string GetName(void) //       
	{
		return m_Name;
	};
private:
	std::string m_Name;
};

class Proxy//   ,      
{
public:
	Proxy(SchoolGirl* mm)
	{
		m_mm = mm;
	};

	void GiveDolls()
	{
		std::cout << m_mm->GetName() << "     " << std::endl;
	};
	
	void GiveFlower()
	{
		std::cout << m_mm->GetName() << "    " << std::endl;
	};

	void GiveChocolate()
	{
		std::cout << m_mm->GetName() << "     " << std::endl;
	};
private:
	SchoolGirl* m_mm;
};
int main()
{
	SchoolGirl* jiaojiao = new SchoolGirl();
	jiaojiao->SetName("   ");

	Proxy* daili = new Proxy(jiaojiao);
	daili->GiveChocolate();
	daili->GiveDolls();
	daili->GiveFlower();

	return 0;
}

 
                   3) 반찬 제3 판
                    개선: 인 터 페 이 스 를 추가 하여 한 대상 이 인 터 페 이 스 를 실현 하도록 하고 대리 가 인 터 페 이 스 를 활용 합 니 다.
                    실현: 대리 역시 인 터 페 이 스 를 실현 하고 대리 가 인 터 페 이 스 를 실현 할 때 실제 실현 자 를 호출 하 는 방법 이다.
 
#include <iostream> 


class SchoolGirl //      
{
public:
	void SetName(std::string str)//   
	{
		m_Name = str;
	};

	std::string GetName(void) //       
	{
		return m_Name;
	};
private:
	std::string m_Name;
};

class GiveGift //     (        ) 
{
	virtual void GiveDolls(void) = 0;
	virtual void GiveFlower(void) = 0;
	virtual void GiveChocolate(void) = 0;
};


class Pursuit :public GiveGift//          
{
public:
	Pursuit(SchoolGirl* mm)
	{
		m_mm = mm;
	};

	void GiveDolls()
	{
		std::cout << m_mm->GetName() << "     " << std::endl;
	};
	
	void GiveFlower()
	{
		std::cout << m_mm->GetName() << "    " << std::endl;
	};

	void GiveChocolate()
	{
		std::cout << m_mm->GetName() << "     " << std::endl;
	};
private:
	SchoolGirl* m_mm;
};


class Proxy :public GiveGift//   (         ,            ) 
{
public:
	Proxy(SchoolGirl* mm)
	{
		m_gg = new Pursuit(mm);
	};

	~Proxy()
	{
		if (m_gg != NULL)
		{
			delete m_gg;
			m_gg = NULL;	
		}	
	};
	void GiveDolls()
	{
		m_gg->GiveDolls();
	};
	
	void GiveFlower()
	{
		m_gg->GiveFlower();
	};

	void GiveChocolate()
	{
		m_gg->GiveChocolate();
	};
private:
	Pursuit* m_gg;
};
int main()
{
 SchoolGirl* jiaojiao = new SchoolGirl();
 jiaojiao->SetName("   ");

 Proxy* daili = new Proxy(jiaojiao);
 daili->GiveChocolate();
 daili->GiveDolls();
 daili->GiveFlower();
 return 0;
}

 
3. 프 록 시 모드 의 고전 템 플 릿
 
     
class Subject
{
public:
	virtual void Request(void) = 0;
};

class RealSubject : public Subject
{
public:
	void Request(void)
	{
		std::cout << "     " << std::endl;
	};
};

class Proxy : public Subject
{
public:
	Proxy()
		:m_realSubject(NULL)
	{
	}
	void Request(void)
	{
		if (m_realSubject == NULL)
		{
			m_realSubject = new RealSubject();
		}
		m_realSubject->Request();
	};
private:
	RealSubject* m_realSubject;
};

int main()
{
	Proxy* daili = new Proxy();
	daili->Request();

	delete daili;
	return 0;
}

 
 

좋은 웹페이지 즐겨찾기