chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

詳解proxy-stub結(jié)構(gòu)的設(shè)計(jì)模式

OpenHarmony技術(shù)社區(qū) ? 來源:HarmonyOS技術(shù)社區(qū) ? 作者:HarmonyOS技術(shù)社區(qū) ? 2022-03-30 09:28 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

OpenHarmony 中存在很多的服務(wù),一般來說可以使得 A 應(yīng)用調(diào)用 B 服務(wù)的方法,就像在自己進(jìn)程中調(diào)用一樣,這里具體的實(shí)現(xiàn)實(shí)際通過 binder 驅(qū)動(dòng)實(shí)現(xiàn)。

binder 驅(qū)動(dòng)通過 mmap 將內(nèi)核態(tài)代碼映射到用戶態(tài),直接讀寫數(shù)據(jù)這樣就完成了跨進(jìn)程的調(diào)用。不過這不是該篇內(nèi)容的重點(diǎn),本片主要講一下 proxy - stub 的設(shè)計(jì)模式。

服務(wù)的一般編碼模式

使用 proxy - stub 架構(gòu)編程,大致可以分為以下三個(gè)步驟:

設(shè)計(jì)接口類,繼承至 IRemoteBroker,接口方法一般設(shè)計(jì)為虛方法。

設(shè)計(jì) proxy 類,繼承至 IRemoteProxy,并且實(shí)現(xiàn) sendRequest 方法和自身虛方法。

設(shè)計(jì) stub 類,繼承至 IRemoteStub ,并且實(shí)現(xiàn) OnRemote 方法和自身虛方法。

這樣我們就可以在調(diào)用是調(diào)用 proxy 類的接口方法就像調(diào)用 stub 類的接口方法一樣了。

源碼剖析

我們通過閱讀源碼,解開其神秘的面紗。我們現(xiàn)在關(guān)注幾個(gè)重點(diǎn)的類。

IRemoteObject:

classIRemoteObject:publicvirtualParcelable,publicvirtualRefBase{
public:
enum{
IF_PROT_DEFAULT,/*Invokerfamily.*/
IF_PROT_BINDER=IF_PROT_DEFAULT,
IF_PROT_DATABUS,
};
enum{
DATABUS_TYPE,
};
classDeathRecipient:publicRefBase{
public:
enum{
ADD_DEATH_RECIPIENT,
REMOVE_DEATH_RECIPIENT,
NOTICE_DEATH_RECIPIENT,
TEST_SERVICE_DEATH_RECIPIENT,
TEST_DEVICE_DEATH_RECIPIENT,
};
virtualvoidOnRemoteDied(constwptr&object)=0;
};

virtualint32_tGetObjectRefCount()=0;

virtualintSendRequest(uint32_tcode,MessageParcel&data,MessageParcel&reply,MessageOption&option)=0;

virtualboolIsProxyObject()const;

virtualboolCheckObjectLegality()const;

virtualboolAddDeathRecipient(constsptr&recipient)=0;

virtualboolRemoveDeathRecipient(constsptr&recipient)=0;

virtualboolMarshalling(Parcel&parcel)constoverride;

staticIRemoteObject*Unmarshalling(Parcel&parcel);

staticboolMarshalling(Parcel&parcel,constsptr&object);

virtualsptrAsInterface();

virtualintDump(intfd,conststd::vector<std::u16string>&args)=0;

conststd::u16stringdescriptor_;

std::u16stringGetObjectDescriptor()const;

protected:
explicitIRemoteObject(std::u16stringdescriptor=nullptr);
};

這就是真正在 binder 驅(qū)動(dòng)中數(shù)據(jù)傳輸?shù)念?,繼承自 Parcelable 。而繼承RefBase 可以理解為智能指針的控制塊。

OpenHarmony 中這里并沒有直接使用 C++ 標(biāo)準(zhǔn)庫中的智能指針,而是使用 sptr 和 refbase 兩個(gè)類共同構(gòu)建,也就是裸指針和控制塊相關(guān)信息。使用后者的方式,更加解耦。符合復(fù)雜架構(gòu)設(shè)計(jì)理念。

IRemoteBroker:


classIRemoteBroker:publicvirtualRefBase{
public:
IRemoteBroker()=default;
virtual~IRemoteBroker()override=default;
virtualsptrAsObject()=0;
staticinlinesptrAsImplement(constsptr&object)
{
returnnullptr;
}
};

#defineDECLARE_INTERFACE_DESCRIPTOR(DESCRIPTOR)
staticinlineconststd::u16stringmetaDescriptor_={DESCRIPTOR};
staticinlineconststd::u16string&GetDescriptor()
{
returnmetaDescriptor_;
}

一般的接口類,通過 metaDescriptor_ 作為表示區(qū)分標(biāo)識。

IRemoteProxy:

namespaceOHOS{
template<typenameINTERFACE>classIRemoteProxy:publicPeerHolder,publicINTERFACE{
public:
explicitIRemoteProxy(constsptr&object);
~IRemoteProxy()override=default;

protected:
sptrAsObject()override;
};

template<typenameINTERFACE>
IRemoteProxy::IRemoteProxy(constsptr&object):PeerHolder(object)
{
}

template<typenameINTERFACE>sptrIRemoteProxy::AsObject()
{
returnRemote();
}
}//namespaceOHOS

IRemoteProxy 使用 c++ 的 crtp (奇特重現(xiàn)模板模式)編程,使得父類可以調(diào)用子類的方法。繼承自 peerhold (其實(shí)就是包括一個(gè) IRemoteObject 對象)。

IRemoteStub:



namespaceOHOS{
template<typenameINTERFACE>classIRemoteStub:publicIPCObjectStub,publicINTERFACE{
public:
IRemoteStub();
virtual~IRemoteStub()=default;
sptrAsObject()override;
sptrAsInterface()override;
};

template<typenameINTERFACE>IRemoteStub::IRemoteStub():IPCObjectStub(INTERFACE::GetDescriptor()){}

template<typenameINTERFACE>sptrIRemoteStub::AsInterface()
{
returnthis;
}

template<typenameINTERFACE>sptrIRemoteStub::AsObject()
{
returnthis;
}
}//namespaceOHOS

stub 對象較于 proxy 對象復(fù)雜一些,也使用 crtp 編程。會繼承 IPCObjectStub(也是 iremoteObject 對象)。

看到這里,可能有人疑惑,為什么 proxy 調(diào)用,會直接調(diào)用到 stub 這端呢?

其實(shí)奧秘就在于 stub 繼承的 IPCObjectStub(繼承 iremoteObject)對象,就是這個(gè) iremoteObject 對象。

proxy 的構(gòu)造繼承 peerhold,peerhold 類中的iremoteObject 對象和 IPCObjectStub 這個(gè)是什么關(guān)系呢?

其實(shí) peerhold 是 IPCObjectStub 的引用對象,實(shí)際類型是 IPCObjectProxy。

這兩者在 ipc 框架中,IPCObjectProxy 實(shí)際使用 sendrequest,IPCObjectStub 便會調(diào)用 OnremoteRequest。如果有興趣,我們下次可以分析 IPC 框架具體是如何實(shí)現(xiàn)的。

原文標(biāo)題:剖析鴻蒙經(jīng)典的proxy - stub架構(gòu)

文章出處:【微信公眾號:HarmonyOS技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

審核編輯:湯梓紅


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1416

    瀏覽量

    41442
  • 架構(gòu)
    +關(guān)注

    關(guān)注

    1

    文章

    528

    瀏覽量

    25987
  • OpenHarmony
    +關(guān)注

    關(guān)注

    29

    文章

    3854

    瀏覽量

    18623

原文標(biāo)題:剖析鴻蒙經(jīng)典的proxy - stub架構(gòu)

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    教你PADS 中如何檢查 Stub 線?。。?/a>

    此份簡明教程將以圖文的形式展示如何幫助您快速和準(zhǔn)確地進(jìn)行 DFM 檢查和優(yōu)化 Stub 線。
    的頭像 發(fā)表于 07-10 15:48 ?9626次閱讀
    教你PADS 中如何檢查 <b class='flag-5'>Stub</b> 線!?。? />    </a>
</div>                              <div   id=

    注冊表結(jié)構(gòu)詳解

    注冊表結(jié)構(gòu)詳解
    發(fā)表于 03-05 15:06

    HarmonyOS遠(yuǎn)端狀態(tài)訂閱開發(fā)實(shí)例

    IPC/RPC提供對遠(yuǎn)端Stub對象狀態(tài)的訂閱機(jī)制, 在遠(yuǎn)端Stub對象消亡時(shí),可觸發(fā)消亡通知告訴本地Proxy對象。這種狀態(tài)通知訂閱需要調(diào)用特定接口完成,當(dāng)不再需要訂閱時(shí)也需要調(diào)用特定接口取消
    發(fā)表于 10-12 14:55

    防火墻術(shù)語-Proxy

    防火墻術(shù)語-Proxy   英文原義:Proxy 中文釋義:代理 注  解:防火墻的一類。工作在應(yīng)用層,特點(diǎn)是兩次連
    發(fā)表于 02-24 11:01 ?1081次閱讀

    開關(guān)電源拓?fù)?b class='flag-5'>結(jié)構(gòu)詳解

    開關(guān)電源拓?fù)?b class='flag-5'>結(jié)構(gòu)詳解
    發(fā)表于 01-14 11:18 ?79次下載

    一文詳解OpenHarmony軟總線

    本次說明可能側(cè)重在標(biāo)準(zhǔn)系統(tǒng)之上。軟總線依舊采用鴻蒙經(jīng)典的 proxy - stub 架構(gòu),接口類 ISoftBusServer,ISoftBusClient。
    的頭像 發(fā)表于 03-30 08:38 ?6440次閱讀

    xsec-proxy-scanner代理掃描器

    xsec-proxy-scanner.zip
    發(fā)表于 04-28 09:18 ?5次下載
    xsec-<b class='flag-5'>proxy</b>-scanner代理掃描器

    php-proxy-app Web代理服務(wù)器

    php-proxy-app.zip
    發(fā)表于 04-29 10:51 ?1次下載
    php-<b class='flag-5'>proxy</b>-app Web代理服務(wù)器

    Tcp-DNS-proxy TCP DNS代理

    Tcp-DNS-proxy.zip
    發(fā)表于 04-29 10:44 ?2次下載
    Tcp-DNS-<b class='flag-5'>proxy</b> TCP DNS代理

    Exchange_proxy Exchange安全代理

    exchange_proxy.zip
    發(fā)表于 05-07 09:51 ?0次下載
    Exchange_<b class='flag-5'>proxy</b> Exchange安全代理

    全面解讀MOSFET結(jié)構(gòu)及設(shè)計(jì)詳解

    MOSFET結(jié)構(gòu)、特性參數(shù)及設(shè)計(jì)詳解
    發(fā)表于 01-26 16:47 ?2125次閱讀

    Stub Generator V.1.00 用戶手冊

    Stub Generator V.1.00 用戶手冊
    發(fā)表于 04-27 19:44 ?0次下載
    <b class='flag-5'>Stub</b> Generator V.1.00 用戶手冊

    設(shè)計(jì)模式結(jié)構(gòu)性:代理模式

    在代理模式Proxy Pattern)中,一個(gè)類代表另一個(gè)類的功能。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式。
    的頭像 發(fā)表于 06-09 15:27 ?1037次閱讀
    設(shè)計(jì)<b class='flag-5'>模式</b><b class='flag-5'>結(jié)構(gòu)</b>性:代理<b class='flag-5'>模式</b>

    PCB設(shè)計(jì)中的Stub對信號傳輸?shù)挠绊?/a>

    PCB設(shè)計(jì)中應(yīng)盡量減少Stub的存在,或者在無法完全避免Stub的情況下,通過優(yōu)化Stub的長度和幾何形狀來降低它們對信號的影響。
    的頭像 發(fā)表于 12-20 18:28 ?215次閱讀
    PCB設(shè)計(jì)中的<b class='flag-5'>Stub</b>對信號傳輸?shù)挠绊? />    </a>
</div>                              <div   id=

    PCB設(shè)計(jì)中的Stub天線對信號傳輸?shù)挠绊?/a>

    在PCB設(shè)計(jì)中,Stub(也稱為短樁線或殘樁線)對信號傳輸有以下幾個(gè)主要影響:1.容性效應(yīng)導(dǎo)致的阻抗偏低:Stub會導(dǎo)致容性效應(yīng),使得阻抗偏低,影響信道的阻抗一致性。Stub越長,阻抗降低得越多
    的頭像 發(fā)表于 12-24 17:21 ?1325次閱讀
    PCB設(shè)計(jì)中的<b class='flag-5'>Stub</b>天線對信號傳輸?shù)挠绊? />    </a>
</div>                    </div>
                    <div   id=