• 设计模式之二-Proxy模式


    代理模式

      组成:

      抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
      代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
      真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
     
      代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
     
    优点:
     
      (1).职责清晰
      真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
      (2).代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。
      (3).高扩展性
     
    模式结构:
      
      一个是真正的你要访问的对象(目标类),一个是代理对象,真正对象与代理
      对象实现同一个接口,先访问代理类再访问真正要访问的对象。
      代理模式分为静态代理、动态代理。
      静态代理是由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
      动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象。
     
    代理模式可以很好的将前后端分开,实现了松散耦合。代理模式属于结构型模式
     
    抽象角色:Building.h
    #ifndef BUILDING_H_
    #define BUILDING_H_
    
    #include <stdio.h>
    
    class Building {
    public:
        Building();
        virtual ~Building();
    
        virtual void soldHouse()=0;
        virtual void rentHouse()=0;
    };
    
    #endif /* BUILDING_H_ *
    代理角色:Agency.h Agency.cpp
    #ifndef AGENCY_H_
    #define AGENCY_H_
    
    #include "Building.h"
    
    class Agency : public Building {
    public:
        Agency(Building *pBuilding);
        ~Agency();
    
        void soldHouse();
        void rentHouse();
    
    private:
        Building *m_Building;
    };
    
    #endif /* AGENCY_H_ */
    #include "Agency.h"
    
    Agency::Agency(Building *pBuliding) {
        // TODO Auto-generated constructor stub
        m_Building = pBuliding;
    }
    
    Agency::~Agency() {
        // TODO Auto-generated destructor stub
    }
    
    
    void Agency::soldHouse()
    {
        m_Building->soldHouse();
    }
    
    void Agency::rentHouse()
    {
        m_Building->rentHouse();
    }

     真实角色:CommunityResident.h CommunityResident.cpp SmallProperty.h SmallProperty.cpp

    #ifndef COMMUNITYRESIDENT_H_
    #define COMMUNITYRESIDENT_H_
    
    #include "Building.h"
    
    class CommunityResident : public Building {
    public:
        CommunityResident();
        ~CommunityResident();
    
        void soldHouse();
        void rentHouse();
    };
    
    #endif /* COMMUNITYRESIDENT_H_ */
    #include "CommunityResident.h"
    
    CommunityResident::CommunityResident() {
        // TODO Auto-generated constructor stub
    
    }
    
    CommunityResident::~CommunityResident() {
        // TODO Auto-generated destructor stub
    }
    
    void CommunityResident::soldHouse()
    {
        printf("community resident sold house
    ");
    }
    
    void CommunityResident::rentHouse()
    {
        printf("community resident rent house
    ");
    }
    #ifndef SMALLPROPERTY_H_
    #define SMALLPROPERTY_H_
    
    #include "Building.h"
    
    class SmallProperty : public Building {
    public:
        SmallProperty();
        ~SmallProperty();
    
        void soldHouse();
        void rentHouse();
    };
    
    #endif /* SMALLPROPERTY_H_ */
    #include "SmallProperty.h"
    
    SmallProperty::SmallProperty() {
        // TODO Auto-generated constructor stub
    
    }
    
    SmallProperty::~SmallProperty() {
        // TODO Auto-generated destructor stub
    }
    
    void SmallProperty::soldHouse()
    {
        printf("small property sold house
    ");
    }
    
    void SmallProperty::rentHouse()
    {
        printf("small property rent house
    ");
    }

    接口调用:main.cpp

    #include "Agency.h"
    #include "CommunityResident.h"
    #include "SmallProperty.h"
    
    void dealWithCommunity()
    {
        Agency *pAgency;
    
        pAgency = new Agency(new CommunityResident());
        pAgency->soldHouse();
        pAgency->rentHouse();
    
        delete pAgency;
    }
    
    void dealWithSmallProperty()
    {
        Agency *pAgency;
    
        pAgency = new Agency(new SmallProperty());
        pAgency->soldHouse();
        pAgency->rentHouse();
    
        delete pAgency;
    }
    
    int main(int argc,char **argv)
    {
        dealWithCommunity();
        dealWithSmallProperty();
        return 0;
    }
  • 相关阅读:
    TS流批量下载----------Xamarin开发系列
    TS视频流下载合成
    B站缓存视频音频合并
    ActiveX录音插件
    FZU-2191 完美的数字 简单数论
    COCI2011/2012 破解密文 KMP
    COCI2010/2011 踢踏舞 线段树区间子段和
    [USACO03FALL] 受欢迎的牛-G tarjan缩点
    洛谷 P1967 货车运输 最大生成树+倍增LCA
    洛谷 P1613 跑路 倍增+最短路
  • 原文地址:https://www.cnblogs.com/wanzaiyimeng/p/6829769.html
Copyright © 2020-2023  润新知