zoukankan      html  css  js  c++  java
  • 2. 代理模式(C++)

    1.介绍

    代理模式:为其他对象提供一种代理以控制对这个对象的访问。这样实现了业务和核心功能分离。
    在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

    代理模式的优点:1.职责清晰;2.易扩展;3.减低耦合,可以保护目标对象。
    代理模式的缺点:1.由于在客户端和真实对象之间增加了代理对象,因此可能会造成额外的开销或者请求处理速度变慢;2.实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

    代理模式其实只是加强了对接口的管理,并不是为了修改或则增强接口功能,这是和适配器模式、装饰模式的主要区别。

    2. UML

    简单的UML图可以表示如下:

    • Subject(抽象主题):声明了 RealSubject 与 Proxy 的共同接口;
    • RealSubject(真实主题):执行具体的业务逻辑,Proxy 控制对它的访问;
    • Proxy(代理):持有一个 RealSubject 引用(指针),可以在需要时将请求转发给 RealSubject,以此起到代理的作用;
    • Client(客户端):调用方。

    3. 实现

    一个简单的实现:

    #include <iostream>
    #include <memory>
    
    class Subject {
    public:
    	virtual ~Subject() {}
    	virtual void Request() = 0;
    };
    
    class RealSubject: public Subject{
    public:
    	void Request() {
    		std::cout << "RealSubject::Request()..." << std::endl;
    	}
    };
    
    class Proxy: public Subject{
    public:
    	Proxy(std::shared_ptr<Subject> subject): subject_(subject) {}
    	~Proxy() {}
    	void Request() {
    		std::cout << "Proxy::Request()..." << std::endl;
    		if(subject_) {
    			subject_->Request();
    		} else {
    			std::cout << "Invalid real subject!" << std::endl;
    		}
    	}
    private:
    	std::shared_ptr<Subject> subject_;
    };
    
    int main() {
    	Proxy proxy(std::make_shared<RealSubject>());
    	proxy.Request();
    	return 0;
    }
    
  • 相关阅读:
    搭建Maven版SSM工程
    mac终端常用的命令
    常见的HTTP请求错误
    Go通关03:控制结构,if、for、switch逻辑语句
    Go通关14:参数传递中,值、引用及指针之间的区别
    Go通关13:究竟在什么情况下才使用指针?
    Go通关12:如何写出高效的并发模式?
    Go通关11:并发控制神器之Context深入浅出
    Go通关10:并发控制,同步原语 sync 包
    Go通关09:并发掌握,goroutine和channel声明与使用!
  • 原文地址:https://www.cnblogs.com/xl2432/p/10121517.html
Copyright © 2011-2022 走看看