PrevUpHomeNext

Proxy Pattern @cpp


代理模式 - cpp

cpp/c++ 设计模式之代理模式

我们在编程时有时会遇到这样一个问题,对于已有的系统, 我们发现有些不足,需要增加或者修改一些代码, 但是我们又不想改变已有的系统,因为它们很“浑圆一体”。这时可以使用代理模式,增加代理代码,而不需要动原来的代码。然后通过对代理代码的访问,来间接访问真正的目标。

3月 - fayige.top

cpp 代码实现

c++ 代理模式

还是以游戏中的导弹为例子。

假定原初的代码里,导弹 missile 有 索敌 seek 方法。后来发现,在做 seek 行为之前,最好先检查一下导弹的状态。于是可以设计一个代理类,增加一个方法 ready, 它会检查并返回导弹的状态,状态良好才会做 seek 行为。

missile - 导弹

cruise missile - 巡航导弹

swarm missile - 蜂群导弹

c++ 代理模式代码比较简单

c++ 代理模式 proxy pattern 例子

文件名:dp_proxy_pattern.cpp

#include <iostream>

namespace wp
{

class missile
{
public:
	virtual ~missile() = default;
	virtual void seek() const = 0;
};

// 巡航导弹
class cruise_missile: virtual public wp::missile
{
public:
	void seek() const override
	{
		std::cout << "巡航导弹正在索敌 ..." << std::endl;
	}
};

// 蜂群导弹
class swarm_missile: virtual public wp::missile
{
public:
	void seek() const override
	{
		std::cout << "蜂群导弹正在索敌 ..." << std::endl;
	}
};

// 巡航导弹代理
class cruise_missile_proxy: virtual public wp::missile
{
protected:
	wp::cruise_missile * missile;
	bool is_ready;
public:
	cruise_missile_proxy():
		missile{new wp::cruise_missile}
	{
	}
	cruise_missile_proxy(const wp::cruise_missile & missile__):
		missile{new wp::cruise_missile{missile__}}
	{
	}
public:
	virtual ~cruise_missile_proxy()
	{
		delete missile;
	}
public:
	void seek() const override
	{
		if (this->ready())
		{
			std::cout << "Cruise missile is ready!" << std::endl;
			missile->seek();
		}
	}

	bool ready() const
	{
		return is_ready;
	}
	void make_ready()
	{
		is_ready = true;
	}
};

class missile_manager
{
public:
	void operator()() const
	{
		auto m1 = wp::cruise_missile{};
		auto m2 = wp::swarm_missile{};
		auto m3 = wp::cruise_missile_proxy{m1};
		
		this->launch(m1);
		this->launch(m2);
		
		m3.make_ready();
		this->launch(m3);
	}
	void launch(wp::missile & missile) const
	{
		missile.seek();
	}
};

}	// namespace wp

int main()
{
	wp::missile_manager mm;
	mm();
}

程序输出:

巡航导弹正在索敌 ...
蜂群导弹正在索敌 ...
Cruise missile is ready!
巡航导弹正在索敌 ...

相关链接

c++桥接模式

c++适配器模式









首页:发一格 fayige.top









版权

Copyright 2024 fayige.top

Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)


PrevUpHomeNext