【提示:如果不想看文字介绍,可以直接跳转到C++编码部分】
【简介】什么是代理模式
????????代理模式?Proxy Pattern?是?种结构型设计模式,?于控制对其他对象的访问。在代理模式中,允许?个对象(代理)充当另?个对象(真实对象)的接?,以控制对这个对象的访问。通常?于在访问某个对象时引??些间接层(中介的作?),这样可以在访问对象时添加额外的控制逻辑,?如限制访问权限,延迟加载。
?????????如说有?个?件加载的场景,为了避免直接访问“?件”对象,我们可以新增?个代理对象,代理对象中有?个对“?件对象”的引?,在代理对象的 load ?法中,可以在访问真实的?件对象之前进??些操作,?如权限检查,然后调?真实?件对象的 load ?法,最后在访问真实对象后进?其他操作,?如记录访问?志。
【基本结构】
代理模式的主要??有:
【实现方式】
????????代理模式的基本实现分为以下?个步骤:(以Java代码做示例)
1. 定义抽象主题, ?般是接?或者抽象类,声明真实主题和代理对象实现的业务?法。
// 1. 定义抽象主题
interface Subject {
void request();
}
2.定义真实主题,实现抽象主题中的具体业务
?
// 2. 定义真实主题
class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject handles the request.");
}
}
3.定义代理类,包含对RealSubject 的引?,并提供和真实主题相同的接?,这样代理就可以替代真实主题,并对真实主题进?功能扩展。
// 3. 定义代理
class Proxy implements Subject {
// 包含?个引?
private RealSubject realSubject;
@Override
public void request() {
// 在访问真实主题之前可以添加额外的逻辑
if (realSubject == null) {
realSubject = new RealSubject();
}
// 调?真实主题的?法
realSubject.request();
// 在访问真实主题之后可以添加额外的逻辑
}
}
4.客户端使?代理
// 4. 客户端使?代理
public class Main {
public static void main(String[] args) {
// 使?代理
Subject proxy = new Proxy();
proxy.request();
}
}
【使用场景】
????????代理模式可以控制客户端对真实对象的访问,从?限制某些客户端的访问权限,此外代理模式还常?在访问真实对象之前或之后执??些额外的操作(?如记录?志),对功能进?扩展。
????????以上特性决定了代理模式在以下?个场景中有着?泛的应?:
????????但是代理模式涉及到多个对象之间的交互,引?代理模式会增加系统的复杂性,在需要频繁访问真实对象时,还可能会有?些性能问题。
????????代理模式在许多?具和库中也有应?:
【扩展】代理模式和适配器模式有什么区别
????????代理模式的主要?的是控制对对象的访问。通常?于在访问真实对象时引??些额外的控制逻辑,如权限控制、延迟加载等。
????????适配器模式的主要?的是使接?不兼容的对象能够协同?作。适配器模式允许将?个类的接?转换成另?个类的接?,使得不同接?的类可以协同?作。
【C++ 编码部分】
1. 题目描述
????????小明想要购买一套房子,他决定寻求一家房屋中介来帮助他找到一个面积超过100平方米的房子,只有符合条件的房子才会被传递给小明查看。
2. 输入描述
????????第一行是一个整数 N(1 ≤ N ≤ 100),表示可供查看的房子的数量。接下来的 N 行,每行包含一个整数,表示对应房子的房屋面积。
3. 输出描述
????????对于每个房子,输出一行,表示是否符合购房条件。如果房屋面积超过100平方米,输出 "YES";否则输出 "NO"。
4. C++编码实例
/**
* @version Copyright (c) 2024 NCDC, Servo。 Unpublished - All rights reserved
* @file ProxyMode.hpp
* @brief 代理模式
* @autor 写代码的小恐龙er
* @date 2024/01/10
*/
#include<iostream>
#include<string>
using namespace std;
// 抽象主题 -- 买房子的人 和 其代理类的 基类 实现业务方法
class AbstractHome
{
public:
virtual void BuyInfo() = 0;
};
// 真实主题 -- 买房子的类
class HomeBuyer : public AbstractHome
{
public:
void BuyInfo() override{
std::cout << "YES" << endl;
}
};
// 【!代理类】 真实类的行为全权由代理类代替
class HomeProxy : public AbstractHome
{
// 包含真实类的实例化对象
private:
HomeBuyer *_homeBuyer = nullptr;
// 在创建代理类时 一并创建真实类
public:
HomeProxy(){
if(_homeBuyer == nullptr) {
_homeBuyer = new HomeBuyer();
}
}
// 将真实类的各个需求属性放置在代理类种
private:
int _areaSize = 0;
// 重写真实类的各个行为
public:
// 一种方法是可以将 判断属性加至代理者的私有属性种 另一种是将其作为参数传入进去
void SetAreaSize(int size){
this->_areaSize = size;
}
void BuyInfo() override{
if(_areaSize > 100) _homeBuyer->BuyInfo();
else std::cout << "NO" << endl;
}
};
// 客户端代码
int main()
{
// 输入的房子数量
int homeNum = 0;
std::cin >> homeNum;
// 创建代理类
AbstractHome *buyerAbstractProxy = new HomeProxy();
// 设置代理类 将抽象类向下类型转换
HomeProxy *homeProxy = dynamic_cast<HomeProxy *>(buyerAbstractProxy);
for(int i = 0; i < homeNum; i++)
{
// 房子的面积大小 -- 需要告知给代理 让其做逻辑判断
int areaSize = 0;
std::cin >> areaSize;
homeProxy->SetAreaSize(areaSize);
// 开始进行逻辑判断
homeProxy->BuyInfo();
}
delete buyerAbstractProxy;
buyerAbstractProxy = nullptr;
return 0;
}
......
To be continued.