代理类:接口与实现的分离

对于提供给客户使用的类,我们如何把接口与实现分离才能更好的体现软件工程的思想呢。我们一般设计类,把类的定义及接口写到相应的头文件中(*.h这样的文件),而对于类中接口(即方法)的定义则放在*.cpp的源文件中,这样的好处就是类的接口与实现分离,然后对于提供给客户的类,客户还是可以看到类头文件中定义的私有属性。虽然客户不一定会直接修改,但我们还是可以把相应的private属性隐藏,让客户只看到相应类所提供的接口。设计的方法是:设计一个Interface类,在这个类中把private属性定义成一个指向我们要实现隐藏的类指针。相应对要隐藏的类再包装一个类,对于内层要隐藏的类的调用,我们可以通过调用外层接口的方式来完成。

代码如下:

Interface头文件

#ifndef INTERFACE_H
#define INTERFACE_H

class Implementation;//声明一个类类型,无需相应的头文件,此处客户也无法查看相应的Implementation类的信息。

class Interface{
public:
Interface(int);//构造函数
~Interface();//析构函数
int getValue();
void setValue(int);//赋值语句
private:
Implementation *ptr;//指向Implementation类的对象
};
#endif

------------------------------------------------------------------------------------

想要隐藏类的Implementation.h头文件

#ifndef IMPLEMENTATION_H
#define IMPLEMENTATION_H
class Implementation{
public:
    Implementation(int);//默认构造函数
    int getValue();//获得value
    void setValue(int);//设置相应的value
private:
    int value;
};
#endif

--------------------------------------------------------------------------------------

Implementation.cpp源文件的实现

#include <iostream>
#include "Implementation.h"
using namespace std;

Implementation::Implementation( int i)//构造函数
    :value(i)
{
    //empty
}

int Implementation::getValue()
{
    return value;
}

void Implementation::setValue( int i)
{
    value = i;//设置相应的函数
}

-----------------------------------------------------------------------------------

Interface.cpp源文件的实现

#include <iostream>
#include "Implementation.h"     //有人可能会说,从Interface.cpp还是可以看到相应的Implementation类的定义的
#include "Interface.h"                    //其实这个地方的Interface.cpp最后是以目标代码的方式提供调用的,不会直接提供源代码的
using namespace std;                      //所有这个很安全

Interface::Interface( int i)
 :ptr(new Implementation(i))//默认构造函数,调用初始化列表器
{
    //empty
}

Interface::~Interface()
{
    delete ptr;//释放相应内存
}

int Interface::getValue()
{
    return ptr->getValue();//返回相应的value值
}

void Interface::setValue(int i)
{
    ptr->setValue(i);
}

---------------------------------------------------------------------

main.cpp源文件的实现

#include <iostream>
#include "Interface.h"//这时,客户代码只能看到Interface.h这个头文件,后面的真正的Implementation类被隐藏

using namespace std;

int main(){
    Interface a1(123);
    cout<<"a1 have value :"<<a1.getValue()<<endl;//a1取值真正来自Implementation
}

 

main.cpp源文件的实现完全隐藏了Implementation类的存在

 

 转自我的个人技术网站

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代理模式是一种常用的设计模式,其主要作用是为其他对象提供一种代理以控制对这个对象的访问。代理模式在 Java 中可以通过接口实现,也可以通过继承实现。下面分别介绍这两种实现方式。 1. 接口实现代理模式 接口实现代理模式需要定义一个接口和一个代理代理实现接口并持有一个接口的引用,通过代理来间接访问目标对象。 示例代码如下: ```java // 定义接口 public interface Subject { void doSomething(); } // 目标对象 public class RealSubject implements Subject { @Override public void doSomething() { System.out.println("RealSubject do something"); } } // 代理 public class Proxy implements Subject { private RealSubject realSubject; public Proxy(RealSubject realSubject) { this.realSubject = realSubject; } @Override public void doSomething() { System.out.println("Before realSubject do something"); realSubject.doSomething(); System.out.println("After realSubject do something"); } } // 测试 public class Test { public static void main(String[] args) { RealSubject realSubject = new RealSubject(); Proxy proxy = new Proxy(realSubject); proxy.doSomething(); } } ``` 运行结果: ``` Before realSubject do something RealSubject do something After realSubject do something ``` 2. 继承实现代理模式 继承实现代理模式需要定义一个目标对象和一个代理对象,代理对象继承目标对象并重写目标对象的方法,在方法中间接访问目标对象。 示例代码如下: ```java // 目标对象 public class RealSubject { public void doSomething() { System.out.println("RealSubject do something"); } } // 代理对象 public class Proxy extends RealSubject { @Override public void doSomething() { System.out.println("Before realSubject do something"); super.doSomething(); System.out.println("After realSubject do something"); } } // 测试 public class Test { public static void main(String[] args) { Proxy proxy = new Proxy(); proxy.doSomething(); } } ``` 运行结果: ``` Before realSubject do something RealSubject do something After realSubject do something ``` 无论是接口实现还是继承实现代理模式的核心是代理和目标对象的分离,通过代理来控制对目标对象的访问,可以在不改变目标对象的情况下增加或修改一些额外的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值