首页 > 其他分享 >设计模式-代理模式

设计模式-代理模式

时间:2023-04-10 11:11:21浏览次数:33  
标签:string giveDolls getName 代理 模式 public strName 设计模式 void

定义

  • 为其他对象提供一种代理以控制对这个对象的访问

类图

时序图

角色定义

  • 抽象主体角色:抽象类或者接口,普通业务的定义
  • 具体主体角色:被代理角色,业务逻辑的具体执行者
  • 代理主体角色:委托类,代理类

优缺点

  • 优点
    1. 职责清晰,实现好内部结构即可,具体客户要求由代理进行分化
    2. 高扩展性:具体主体角色随时变化,只要实现了接口,都可以由代理来处理

应用场景

  • 游戏代理服务器

实现

  • example 1
#include<iostream>
using namespace std;

class Subject {
public:
    virtual void func(){
        cout << "Subject" << endl;
    }
};

class RealSubject : public Subject{
public:
    virtual void func(){
        cout << "RealSubject" << endl;
    }
};

class Proxy : public Subject{
public:
    virtual void func()
    {
        cout << "Proxy" << endl;
        m_real.func();
    }
private:
    RealSubject m_real;
};

int main()
{
    Proxy CProxy;
    CProxy.func();
    return 0;
}
  • example 2
// 大话设计模式样例
#include<iostream>
#include<string>
using namespace std;

class SchoolGirl
{
public:
    string getName(){
        return m_strName;
    }
    void setName(string name){
        m_strName = name;
    }
private:
    string m_strName;
};

class Gift
{
public:
     void giveDolls();
     void giveFlowers();
     void giveChocolate();
};

class Pursuit : public Gift
{
public:
    Pursuit(SchoolGirl* pGirl) : m_Girl(pGirl){}
    string getName(){
        return m_strName;
    }
    void setName(string strName){
        m_strName = strName;
    }
    void giveDolls(){
        cout << m_strName << "give [" << m_Girl->getName() << "] Dolls" << endl;
    }
    void giveFlowers(){
        cout << m_strName << "give [" << m_Girl->getName() << "] flowers" << endl;
    }
    void giveChocolate(){
        cout << m_strName << "give [" << m_Girl->getName() << "] chocolate" << endl;
    }
private:
    SchoolGirl* m_Girl;
    string m_strName;
};

class Proxy : public Gift
{
public:
    Proxy(SchoolGirl* pGirl){
        m_Pur = new Pursuit(pGirl);
        m_Pur->setName("胡汉三");
    }

    void giveDolls(){
        m_Pur->giveDolls();
    }
    void giveFlowers(){
        m_Pur->giveFlowers();
    }
    void giveChocolate(){
        m_Pur->giveChocolate();
    }
private:
    Pursuit* m_Pur;
};

int main()
{
    SchoolGirl* pJiaoJiao = new SchoolGirl;
    pJiaoJiao->setName("李娇娇");

    Proxy* pDali = new Proxy(pJiaoJiao);
    pDali->giveDolls();
    pDali->giveFlowers();
    pDali->giveChocolate();

    return 0;
}

标签:string,giveDolls,getName,代理,模式,public,strName,设计模式,void
From: https://www.cnblogs.com/wanghao-boke/p/17302276.html

相关文章

  • Linux&Nginx16_Nginx反向代理6
    一、概念反向代理代理(ReverseProxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。首先我们先理解正向代理,如下图: ......
  • Java知识小拓展之适配器模式
    一:设计模式设计模式是一套被反复使用的、多数人知晓的、经过分类编写的、设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被人理解、保证代码的可靠性、程序的可靠性。简单的理解它就像给了你一个模板,是一种像数学中的一种解题套路一样,不同的是它有各种套路。二:适配器......
  • 云计算的三种模式IaaS/PaaS/SaaS/BaaS对比:SaaS架构设计分析
    SaaS——软件即服务(SoftwareasaService)的出现改变了传统使用软件转变为使用服务。SaaS与传统软件的最大区别是,前者按年付费租用服务,后者一次买断。这貌似只是“报价方式”的区别,实际上这是一个根本性的变化,这带来的是对服务模式、销售模式、公司价值等多维度的根本影响。传......
  • .NET Core MongoDB数据仓储和工作单元模式封装
    前言     上一章我们把系统所需要的MongoDB集合设计好了,这一章我们的主要任务是使用.NETCore应用程序连接MongoDB并且封装MongoDB数据仓储和工作单元模式,因为本章内容涵盖的有点多关于仓储和工作单元的使用就放到下一章节中讲解了。仓储模式(Repository )带来的好处是一......
  • Rust语言 学习05 枚举与模式匹配
    一、定义枚举enumMessage{Quit,Move{x:i32,y:i32},Write(String),ChangeColor(i32,i32,i32),}fnmain(){letq=Message::Quit;letm=Message::Move{x:12,y:24};letw=Message::Write(String::from("Hello"));letc......
  • 爬虫最后一天,爬取到的数据存到mysql中,爬虫和下载中间件、加代理、cookie、header、se
    爬到的数据存到mysql中classFirstscrapyMySqlPipeline:defopen_spider(self,spider):print('我开了')self.conn=pymysql.connect(user='root',password="",host='127.0.0.1......
  • [权限]基于角色+权限配置模式
    基于角色+权限配置模式可以将权限粒度设置的更细致一些。具体参考前端:登录成功后,再获取权限列表,在页面上进行权限判断。后端:不变登录当用户登录时,将用户角色写入到vuex,保存当前用户角色信息。vuex中import{createStore}from'vuex'exportdefaultcreateStore({......
  • git设置代理
    背景国内提交代码到github,因为网络原因很蛋疼~需要设置代理,才能正常且快速的提交代码。刚巧我有国外的云服务器,自己搭建了一个socket5代理。设置代理命令设置代理gitconfig--globalhttps.proxy"socks5://ip:1080"#socksgitconfig--globalhttp.proxy'socks5://127......
  • 挂件模式用挂载菜单的方式使用上手视频教程
    挂件模式用挂载菜单的方式使用上手视频教程jjj......
  • RabbitMQ 10 头部模式
    头部模式是根据头部信息来决定的,在发送的消息中是可以携带一些头部信息的(类似于HTTP),可以根据这些头部信息来决定路由到哪一个消息队列中。定义配置类。importorg.springframework.amqp.core.Binding;importorg.springframework.amqp.core.BindingBuilder;importorg.sprin......