某些接口之间的依赖,往往会带来问题,添加一层间隔的稳定接口来隔离接口,常常是一种解决办法。
facade,proxy,adapter,mediator属于接口隔离类。
motivation:在某些情况下(例如对象创建的开销很大,某些操作需要安全控制,或者需要进行线程外的访问),直接访问会给使用者或者系统带来很多麻烦;需要为其他对象提供一种代理一控制对该对象那个的访问。
key interface or class:
1. facade的高层接口。
feature: facade接口,隔离开用户和子系统。
structure:
template codes:
///
class ISubject{
public:
virtual void Process()=0;
}
class RealSubject:public ISubject
{
public:
virtual void Process(){
//实现具体的方法
}
}
class ClientApp{
private:
ISubject* subject;
public:
ClientApp(){
subject = new RealSubject();
//因为一些原因,例如分布式或者安全原因等,不能直接拿到对象
}
void DoTask(){
subject->Process();
}
}
//proxy的实现,在此处实现对对象的访问
class RealSubject:public ISubject
{
public:
virtual void Process(){
//对对象的间接访问
//实现具体的方法
}
}
class ClientApp{
private:
ISubject* subject;
public:
ClientApp(){
subject = new RealSubject();
//因为一些原因,例如分布式或者安全原因等,不能直接拿到对象
}
void DoTask(){
subject->Process();
}
}
summary:
1. 在面对对象的系统中,直接访问某个对象经常会带来很多麻烦,增加间接访问层往往是有效的解决方法;
2.proxy的实现粒度差别很大,有的可能对单个对象做细粒度的操作,有的可能对整个架构层次对对象做proxy,为组件模块提供抽象代理层;
3.proxy并不要求保持对接口的完整一致性,只要能够实现间接控制,牺牲部分透明性也是可以接受的。