概念
代理模式:为其他对象提供一种代理以控制对这个对象的访问。
代理模式是一种应用很广 泛的结构型设计模式,而且变化形式非常多,常见的代理形式包括远程代理、保护代理、虚拟代理、缓冲代理。
代理模式结构图
Subject类,定义了RealSubject和Proxy的共用接口这样就在任何使用realSubject的地方都可以使用ProxyRealSubject类,定义Proxy所代表的真实实体
Proxy类,保存一个引用是的代理可以访问实体、并提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体
代码实现
class Subject
{
public:
virtual void Requst() = 0;
};
class ReadSubject : public Subject
{
public:
void Requst()
{
cout << "真实请求" << endl;
}
};
class Proxy
{
public:
void Requst()
{
if (sub == nullptr)
{
sub = new ReadSubject();
}
cout << "代理对象代理了:";
sub->Requst();
}
private:
ReadSubject *sub;
};
int main()
{
Proxy p ;
p.Requst();
return 0;
}
具体例子的代码实现
平时我们在某些视频软件上看电影时,会有免费电影 VIP电影 付费电影 。这些电影会根据我们用户的身份去开放不同的权限。
//抽象类电影
class Movie
{
public:
virtual void freeMovies() = 0;
virtual void vipMovies() = 0;
virtual void ticketMovies() = 0;
};
//真实类电影
class RealMovie
{
public:
void freeMovies()
{
cout << "观看免费电影" << endl;
}
void vipMovies()
{
cout << "观看VIP电影" << endl;
}
void ticketMovies()
{
cout << "用券观看电影" << endl;
}
};
//代理类 代理free电影
class freeMovieProxy : public Movie
{
public:
void freeMovies()
{
movie.freeMovies();
}
void vipMovies()
{
cout << "您是普通用户,需要升级为VIP用户,即可观看VIP电影" << endl;
}
void ticketMovies()
{
cout << "您目前没有券,需要购买电影券,即可观看电影" << endl;
}
private:
RealMovie movie;
};
//代理类 代理vip电影
class VIPMovieProxy : public Movie
{
public:
void freeMovies()
{
movie.freeMovies();
}
void vipMovies()
{
movie.vipMovies();
}
void ticketMovies()
{
cout << "您目前没有券,需要购买电影券,即可观看电影" << endl;
}
private:
RealMovie movie;
};
void witch(Movie *movie)
{
movie->freeMovies();
movie->vipMovies();
movie->ticketMovies();
}
int main()
{
Movie *m1 = new freeMovieProxy();
Movie *m2 = new VIPMovieProxy();
witch(m1);
witch(m2);
return 0;
}