博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之二-Proxy模式
阅读量:4943 次
发布时间:2019-06-11

本文共 3244 字,大约阅读时间需要 10 分钟。

代理模式

  组成:

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

 

接口调用: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;}

 

 

 

转载于:https://www.cnblogs.com/wanzaiyimeng/p/6829769.html

你可能感兴趣的文章
graphviz入门
查看>>
CSS可以和不可以继承的属性
查看>>
eclipse每次当我按ctrl+鼠标点击代码,自动关闭,产生原因及解决办法!!
查看>>
hbase
查看>>
用PHP将Unicode 转化为UTF-8
查看>>
HDOJ1002 A+B Problem II
查看>>
ADB server didn't ACK(adb不能开启
查看>>
Python基础(三)
查看>>
Continuous integration
查看>>
hl7 V2中Message Control ID的含义及应用
查看>>
IOS 4个容易混淆的属性(textAligment contentVerticalAlignment contentHorizontalAlignment contentMode)...
查看>>
C#HttpHelper类1.3正式版教程与升级报告
查看>>
Quartz和TopShelf Windows服务作业调度
查看>>
让ie9之前的版本支持canvas
查看>>
排序规则
查看>>
percent的用法
查看>>
Hibernate三种状态详解
查看>>
判断一个数是否是2^N次方
查看>>
js中几种实用的跨域方法原理详解
查看>>
打印图形
查看>>