在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

一起看看責(zé)任鏈設(shè)計(jì)模式吧!

Android編程精選 ? 來源:CSDN ? 作者:Java小海 ? 2022-07-08 16:25 ? 次閱讀
  • 什么是責(zé)任鏈
  • 場景
    • 反例
    • 初步改造
    • 缺點(diǎn)
    • 責(zé)任鏈改造
    • 責(zé)任鏈工廠改造
  • 聊聊其他

最近,我讓團(tuán)隊(duì)內(nèi)一位成員寫了一個(gè)導(dǎo)入功能。他使用了責(zé)任鏈模式,代碼堆的非常多,bug 也多,沒有達(dá)到我預(yù)期的效果。實(shí)際上,針對導(dǎo)入功能,我認(rèn)為模版方法更合適!為此,隔壁團(tuán)隊(duì)也拿出我們的案例,進(jìn)行了集體 code review。

學(xué)好設(shè)計(jì)模式,且不要為了練習(xí),強(qiáng)行使用!讓原本100行就能實(shí)現(xiàn)的功能,寫了 3000 行!

對錯(cuò)暫且不論,我們先一起看看責(zé)任鏈設(shè)計(jì)模式吧!

什么是責(zé)任鏈

「責(zé)任鏈模式」 是一種行為設(shè)計(jì)模式, 允許你將請求沿著處理者鏈進(jìn)行發(fā)送。收到請求后, 每個(gè)處理者均可對請求進(jìn)行處理, 或?qū)⑵鋫鬟f給鏈上的下個(gè)處理者。

3dca85f4-fc56-11ec-ba43-dac502259ad0.png

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能。

項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro

場景

責(zé)任鏈的使用場景還是比較多的

  • 多條件流程判斷:權(quán)限控制
  • ERP 系統(tǒng)流程審批:總經(jīng)理、人事經(jīng)理、項(xiàng)目經(jīng)理
  • Java 過濾器 的底層實(shí)現(xiàn) Filter

如果不使用該設(shè)計(jì)模式,那么當(dāng)需求有所改變時(shí),就會使得代碼臃腫或者難以維護(hù),例如下面的例子

反例

假設(shè)現(xiàn)在有一個(gè)闖關(guān)游戲,進(jìn)入下一關(guān)的條件是上一關(guān)的分?jǐn)?shù)要高于xx

  1. 游戲一共 3 個(gè)關(guān)卡
  2. 進(jìn)入第二關(guān)需要第一關(guān)的游戲得分大于等于 80
  3. 進(jìn)入第三關(guān)需要第二關(guān)的游戲得分大于等于 90

那么代碼可以這樣寫

//第一關(guān)
publicclassFirstPassHandler{
publicinthandler(){
System.out.println("第一關(guān)-->FirstPassHandler");
return80;
}
}

//第二關(guān)
publicclassSecondPassHandler{
publicinthandler(){
System.out.println("第二關(guān)-->SecondPassHandler");
return90;
}
}


//第三關(guān)
publicclassThirdPassHandler{
publicinthandler(){
System.out.println("第三關(guān)-->ThirdPassHandler,這是最后一關(guān)啦");
return95;
}
}

//客戶端
publicclassHandlerClient{
publicstaticvoidmain(String[]args){

FirstPassHandlerfirstPassHandler=newFirstPassHandler();//第一關(guān)
SecondPassHandlersecondPassHandler=newSecondPassHandler();//第二關(guān)
ThirdPassHandlerthirdPassHandler=newThirdPassHandler();//第三關(guān)

intfirstScore=firstPassHandler.handler();
//第一關(guān)的分?jǐn)?shù)大于等于80則進(jìn)入第二關(guān)
if(firstScore>=80){
intsecondScore=secondPassHandler.handler();
//第二關(guān)的分?jǐn)?shù)大于等于90則進(jìn)入第二關(guān)
if(secondScore>=90){
thirdPassHandler.handler();
}
}
}
}

那么如果這個(gè)游戲有100關(guān),我們的代碼很可能就會寫成這個(gè)樣子

if(第1關(guān)通過){
//第2關(guān)游戲
if(第2關(guān)通過){
//第3關(guān)游戲
if(第3關(guān)通過){
//第4關(guān)游戲
if(第4關(guān)通過){
//第5關(guān)游戲
if(第5關(guān)通過){
//第6關(guān)游戲
if(第6關(guān)通過){
//...
}
}
}
}
}
}

這種代碼不僅冗余,并且當(dāng)我們要將某兩關(guān)進(jìn)行調(diào)整時(shí)會對代碼非常大的改動,這種操作的風(fēng)險(xiǎn)是很高的,因此,該寫法非常糟糕

初步改造

如何解決這個(gè)問題,我們可以通過鏈表將每一關(guān)連接起來,形成責(zé)任鏈的方式,第一關(guān)通過后是第二關(guān),第二關(guān)通過后是第三關(guān) ....,這樣客戶端就不需要進(jìn)行多重 if 的判斷了

publicclassFirstPassHandler{
/**
*第一關(guān)的下一關(guān)是第二關(guān)
*/
privateSecondPassHandlersecondPassHandler;

publicvoidsetSecondPassHandler(SecondPassHandlersecondPassHandler){
this.secondPassHandler=secondPassHandler;
}

//本關(guān)卡游戲得分
privateintplay(){
return80;
}

publicinthandler(){
System.out.println("第一關(guān)-->FirstPassHandler");
if(play()>=80){
//分?jǐn)?shù)>=80并且存在下一關(guān)才進(jìn)入下一關(guān)
if(this.secondPassHandler!=null){
returnthis.secondPassHandler.handler();
}
}

return80;
}
}

publicclassSecondPassHandler{

/**
*第二關(guān)的下一關(guān)是第三關(guān)
*/
privateThirdPassHandlerthirdPassHandler;

publicvoidsetThirdPassHandler(ThirdPassHandlerthirdPassHandler){
this.thirdPassHandler=thirdPassHandler;
}

//本關(guān)卡游戲得分
privateintplay(){
return90;
}

publicinthandler(){
System.out.println("第二關(guān)-->SecondPassHandler");

if(play()>=90){
//分?jǐn)?shù)>=90并且存在下一關(guān)才進(jìn)入下一關(guān)
if(this.thirdPassHandler!=null){
returnthis.thirdPassHandler.handler();
}
}

return90;
}
}

publicclassThirdPassHandler{

//本關(guān)卡游戲得分
privateintplay(){
return95;
}

/**
*這是最后一關(guān),因此沒有下一關(guān)
*/
publicinthandler(){
System.out.println("第三關(guān)-->ThirdPassHandler,這是最后一關(guān)啦");
returnplay();
}
}

publicclassHandlerClient{
publicstaticvoidmain(String[]args){

FirstPassHandlerfirstPassHandler=newFirstPassHandler();//第一關(guān)
SecondPassHandlersecondPassHandler=newSecondPassHandler();//第二關(guān)
ThirdPassHandlerthirdPassHandler=newThirdPassHandler();//第三關(guān)

firstPassHandler.setSecondPassHandler(secondPassHandler);//第一關(guān)的下一關(guān)是第二關(guān)
secondPassHandler.setThirdPassHandler(thirdPassHandler);//第二關(guān)的下一關(guān)是第三關(guān)

//說明:因?yàn)榈谌P(guān)是最后一關(guān),因此沒有下一關(guān)
//開始調(diào)用第一關(guān)每一個(gè)關(guān)卡是否進(jìn)入下一關(guān)卡在每個(gè)關(guān)卡中判斷
firstPassHandler.handler();

}
}

缺點(diǎn)

現(xiàn)有模式的缺點(diǎn)

  • 每個(gè)關(guān)卡中都有下一關(guān)的成員變量并且是不一樣的,形成鏈很不方便
  • 代碼的擴(kuò)展性非常不好

責(zé)任鏈改造

  • 既然每個(gè)關(guān)卡中都有下一關(guān)的成員變量并且是不一樣的,那么我們可以在關(guān)卡上抽象出一個(gè)父類或者接口,然后每個(gè)具體的關(guān)卡去繼承或者實(shí)現(xiàn)

有了思路,我們先來簡單介紹一下責(zé)任鏈設(shè)計(jì)模式的「基本組成」

  • 抽象處理者(Handler)角色:定義一個(gè)處理請求的接口,包含抽象處理方法和一個(gè)后繼連接。
  • 具體處理者(Concrete Handler)角色:實(shí)現(xiàn)抽象處理者的處理方法,判斷能否處理本次請求,如果可以處理請求則處理,否則將該請求轉(zhuǎn)給它的后繼者。
  • 客戶類(Client)角色:創(chuàng)建處理鏈,并向鏈頭的具體處理者對象提交請求,它不關(guān)心處理細(xì)節(jié)和請求的傳遞過程。
3de1a3a6-fc56-11ec-ba43-dac502259ad0.jpg責(zé)任鏈改造
publicabstractclassAbstractHandler{

/**
*下一關(guān)用當(dāng)前抽象類來接收
*/
protectedAbstractHandlernext;

publicvoidsetNext(AbstractHandlernext){
this.next=next;
}

publicabstractinthandler();
}

publicclassFirstPassHandlerextendsAbstractHandler{

privateintplay(){
return80;
}

@Override
publicinthandler(){
System.out.println("第一關(guān)-->FirstPassHandler");
intscore=play();
if(score>=80){
//分?jǐn)?shù)>=80并且存在下一關(guān)才進(jìn)入下一關(guān)
if(this.next!=null){
returnthis.next.handler();
}
}
returnscore;
}
}

publicclassSecondPassHandlerextendsAbstractHandler{

privateintplay(){
return90;
}

publicinthandler(){
System.out.println("第二關(guān)-->SecondPassHandler");

intscore=play();
if(score>=90){
//分?jǐn)?shù)>=90并且存在下一關(guān)才進(jìn)入下一關(guān)
if(this.next!=null){
returnthis.next.handler();
}
}

returnscore;
}
}

publicclassThirdPassHandlerextendsAbstractHandler{

privateintplay(){
return95;
}

publicinthandler(){
System.out.println("第三關(guān)-->ThirdPassHandler");
intscore=play();
if(score>=95){
//分?jǐn)?shù)>=95并且存在下一關(guān)才進(jìn)入下一關(guān)
if(this.next!=null){
returnthis.next.handler();
}
}
returnscore;
}
}

publicclassHandlerClient{
publicstaticvoidmain(String[]args){

FirstPassHandlerfirstPassHandler=newFirstPassHandler();//第一關(guān)
SecondPassHandlersecondPassHandler=newSecondPassHandler();//第二關(guān)
ThirdPassHandlerthirdPassHandler=newThirdPassHandler();//第三關(guān)

//和上面沒有更改的客戶端代碼相比,只有這里的set方法發(fā)生變化,其他都是一樣的
firstPassHandler.setNext(secondPassHandler);//第一關(guān)的下一關(guān)是第二關(guān)
secondPassHandler.setNext(thirdPassHandler);//第二關(guān)的下一關(guān)是第三關(guān)

//說明:因?yàn)榈谌P(guān)是最后一關(guān),因此沒有下一關(guān)

//從第一個(gè)關(guān)卡開始
firstPassHandler.handler();

}
}

責(zé)任鏈工廠改造

對于上面的請求鏈,我們也可以把這個(gè)關(guān)系維護(hù)到配置文件中或者一個(gè)枚舉中。我將使用枚舉來教會大家怎么動態(tài)的配置請求鏈并且將每個(gè)請求者形成一條調(diào)用鏈。

publicenumGatewayEnum{
//handlerId,攔截者名稱,全限定類名,preHandlerId,nextHandlerId
API_HANDLER(newGatewayEntity(1,"api接口限流","cn.dgut.design.chain_of_responsibility.GateWay.impl.ApiLimitGatewayHandler",null,2)),
BLACKLIST_HANDLER(newGatewayEntity(2,"黑名單攔截","cn.dgut.design.chain_of_responsibility.GateWay.impl.BlacklistGatewayHandler",1,3)),
SESSION_HANDLER(newGatewayEntity(3,"用戶會話攔截","cn.dgut.design.chain_of_responsibility.GateWay.impl.SessionGatewayHandler",2,null)),
;

GatewayEntitygatewayEntity;

publicGatewayEntitygetGatewayEntity(){
returngatewayEntity;
}

GatewayEnum(GatewayEntitygatewayEntity){
this.gatewayEntity=gatewayEntity;
}
}

publicclassGatewayEntity{

privateStringname;

privateStringconference;

privateIntegerhandlerId;

privateIntegerpreHandlerId;

privateIntegernextHandlerId;
}

publicinterfaceGatewayDao{

/**
*根據(jù)handlerId獲取配置項(xiàng)
*@paramhandlerId
*@return
*/
GatewayEntitygetGatewayEntity(IntegerhandlerId);

/**
*獲取第一個(gè)處理者
*@return
*/
GatewayEntitygetFirstGatewayEntity();
}

publicclassGatewayImplimplementsGatewayDao{

/**
*初始化,將枚舉中配置的handler初始化到map中,方便獲取
*/
privatestaticMapgatewayEntityMap=newHashMap<>();

static{
GatewayEnum[]values=GatewayEnum.values();
for(GatewayEnumvalue:values){
GatewayEntitygatewayEntity=value.getGatewayEntity();
gatewayEntityMap.put(gatewayEntity.getHandlerId(),gatewayEntity);
}
}

@Override
publicGatewayEntitygetGatewayEntity(IntegerhandlerId){
returngatewayEntityMap.get(handlerId);
}

@Override
publicGatewayEntitygetFirstGatewayEntity(){
for(Map.Entryentry:gatewayEntityMap.entrySet()){
GatewayEntityvalue=entry.getValue();
//沒有上一個(gè)handler的就是第一個(gè)
if(value.getPreHandlerId()==null){
returnvalue;
}
}
returnnull;
}
}

publicclassGatewayHandlerEnumFactory{

privatestaticGatewayDaogatewayDao=newGatewayImpl();

//提供靜態(tài)方法,獲取第一個(gè)handler
publicstaticGatewayHandlergetFirstGatewayHandler(){

GatewayEntityfirstGatewayEntity=gatewayDao.getFirstGatewayEntity();
GatewayHandlerfirstGatewayHandler=newGatewayHandler(firstGatewayEntity);
if(firstGatewayHandler==null){
returnnull;
}

GatewayEntitytempGatewayEntity=firstGatewayEntity;
IntegernextHandlerId=null;
GatewayHandlertempGatewayHandler=firstGatewayHandler;
//迭代遍歷所有handler,以及將它們鏈接起來
while((nextHandlerId=tempGatewayEntity.getNextHandlerId())!=null){
GatewayEntitygatewayEntity=gatewayDao.getGatewayEntity(nextHandlerId);
GatewayHandlergatewayHandler=newGatewayHandler(gatewayEntity);
tempGatewayHandler.setNext(gatewayHandler);
tempGatewayHandler=gatewayHandler;
tempGatewayEntity=gatewayEntity;
}
//返回第一個(gè)handler
returnfirstGatewayHandler;
}

/**
*反射實(shí)體化具體的處理者
*@paramfirstGatewayEntity
*@return
*/
privatestaticGatewayHandlernewGatewayHandler(GatewayEntityfirstGatewayEntity){
//獲取全限定類名
StringclassName=firstGatewayEntity.getConference();
try{
//根據(jù)全限定類名,加載并初始化該類,即會初始化該類的靜態(tài)段
Classclazz=Class.forName(className);
return(GatewayHandler)clazz.newInstance();
}catch(ClassNotFoundException|IllegalAccessException|InstantiationExceptione){
e.printStackTrace();
}
returnnull;
}
}

publicclassGetewayClient{
publicstaticvoidmain(String[]args){
GetewayHandlerfirstGetewayHandler=GetewayHandlerEnumFactory.getFirstGetewayHandler();
firstGetewayHandler.service();
}
}

基于微服務(wù)的思想,構(gòu)建在 B2C 電商場景下的項(xiàng)目實(shí)戰(zhàn)。核心技術(shù)棧,是 Spring Boot + Dubbo 。未來,會重構(gòu)成 Spring Cloud Alibaba 。

項(xiàng)目地址:https://github.com/YunaiV/onemall

聊聊其他

設(shè)計(jì)模式有很多,責(zé)任鏈只是其中的一種,我覺得很有意思,非常值得一學(xué)。

設(shè)計(jì)模式確實(shí)是一門藝術(shù),仍需努力呀

審核編輯 :李倩


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

    關(guān)注

    20

    文章

    2987

    瀏覽量

    107290
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4891

    瀏覽量

    70361
  • 過濾器
    +關(guān)注

    關(guān)注

    1

    文章

    437

    瀏覽量

    20280

原文標(biāo)題:同事寫了一個(gè)責(zé)任鏈模式,bug無數(shù)!

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

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

    AN-166:與Linduino一起飛行中更新

    電子發(fā)燒友網(wǎng)站提供《AN-166:與Linduino一起飛行中更新.pdf》資料免費(fèi)下載
    發(fā)表于 01-12 10:09 ?0次下載
    AN-166:與Linduino<b class='flag-5'>一起</b>飛行中更新

    和Dr Peter一起學(xué)KiCad 4.8:設(shè)計(jì)規(guī)則檢查(DRC)

    和Dr Peter一起學(xué)KiCad 4.8:設(shè)計(jì)規(guī)則檢查(DRC)
    的頭像 發(fā)表于 12-25 14:55 ?1732次閱讀
    和Dr Peter<b class='flag-5'>一起</b>學(xué)KiCad 4.8:設(shè)計(jì)規(guī)則檢查(DRC)

    快來“一起鴻蒙”!體驗(yàn)更出色,智慧再升級

    當(dāng)鴻蒙遇上脫口秀,會擦出什么樣的火花?“一起鴻蒙”給出了答案。華為邀請了呼蘭、賈耗、漫才兄弟、龐博、小鹿等藝人,用脫口秀獨(dú)有的風(fēng)趣幽默方式,將原生鴻蒙帶入觀眾的視野。從真實(shí)的應(yīng)用場景出發(fā),脫口秀
    的頭像 發(fā)表于 12-25 14:45 ?380次閱讀
    快來“<b class='flag-5'>一起</b>鴻蒙<b class='flag-5'>吧</b>”!體驗(yàn)更出色,智慧再升級

    ADS8327模式怎么用?

    如圖:圖59的CS是是分開的,圖60的CS時(shí)序又是同步的。CS分開很難實(shí)現(xiàn),DSP驅(qū)動時(shí)會很復(fù)雜,我想知道三片ADS8327的CS腳連一起可不可以工作。 如果CS共用,三片只能都配置為模式
    發(fā)表于 11-26 06:46

    請問tas5731m PBTL模式,單聲道輸出(AB連一起,CD連一起)如何實(shí)現(xiàn)左右聲道的混音輸出?

    請問tas5731m PBTL模式,單聲道輸出(AB連一起,CD連一起)如何實(shí)現(xiàn)左右聲道的混音輸出 還有開發(fā)軟件里能直接拉線么
    發(fā)表于 10-17 06:23

    隔離電源的地能接在一起嗎,隔離電源能不能直接共地使用

    不能接在一起。在使用隔離電源時(shí),需要將隔離電源的輸入和輸出端的地線分別接在接地柱和接地線上,而不能將它們接在一起。實(shí)際上,如果將隔離電源兩端的地線接在一起,會導(dǎo)致接地系統(tǒng)的干擾,降低系統(tǒng)的工作穩(wěn)定性
    的頭像 發(fā)表于 10-01 16:27 ?7407次閱讀

    還在自己實(shí)現(xiàn)責(zé)任?我建議你造輪子之前先看看這個(gè)開源項(xiàng)目

    1. 前言 設(shè)計(jì)模式在軟件開發(fā)中被廣泛使用。通過使用設(shè)計(jì)模式,開發(fā)人員可以更加高效地開發(fā)出高質(zhì)量的軟件系統(tǒng),提高代碼的可讀性、可維護(hù)性和可擴(kuò)展性。 責(zé)任
    的頭像 發(fā)表于 09-20 14:38 ?572次閱讀
    還在自己實(shí)現(xiàn)<b class='flag-5'>責(zé)任</b><b class='flag-5'>鏈</b>?我建議你造輪子之前先<b class='flag-5'>看看</b>這個(gè)開源項(xiàng)目

    將5G信號與電平轉(zhuǎn)換結(jié)合在一起

    電子發(fā)燒友網(wǎng)站提供《將5G信號與電平轉(zhuǎn)換結(jié)合在一起.pdf》資料免費(fèi)下載
    發(fā)表于 09-18 14:49 ?1次下載
    將5G信號<b class='flag-5'>鏈</b>與電平轉(zhuǎn)換結(jié)合在<b class='flag-5'>一起</b>

    模擬地和電源地能接在一起

    模擬地和電源地是否能接在一起,取決于電子系統(tǒng)的具體要求和設(shè)計(jì)。在電子系統(tǒng)中,地(Ground)是個(gè)共同的參考點(diǎn),用于構(gòu)建電位參考平面。電源地是所有電源網(wǎng)絡(luò)的參考點(diǎn),用于確保電源的穩(wěn)定性和系統(tǒng)的正常工作。模擬地則與模擬電路相關(guān),用于提供參考電位。
    的頭像 發(fā)表于 09-15 11:43 ?3131次閱讀

    選2088還是3051?一起來說說TA們的不同~

    作為工業(yè)實(shí)踐中最常用的現(xiàn)場儀表,變送器被廣泛應(yīng)用于各種工業(yè)自控環(huán)境,涉及水利水電、鐵路交通、智能建筑、生產(chǎn)自控、航空航天、石化、油井、電力、船舶、機(jī)床、管道等眾多行業(yè)。今天我們一起來看看「2088壓力變送器」、「3051差壓變送器」這兩款變送器有啥區(qū)別?
    的頭像 發(fā)表于 09-02 10:40 ?1270次閱讀
    選2088還是3051?<b class='flag-5'>一起</b>來說說TA們的不同~

    增量式編碼器3大特點(diǎn),工作模式,精度,輸出脈沖信號 一起了解下嗎

    增量式編碼器3大特點(diǎn),工作模式,精度,輸出脈沖信號...一起了解下嗎?在現(xiàn)代工業(yè)自動化和控制系統(tǒng)中,增量式編碼器扮演著至關(guān)重要的角色。它可以將機(jī)械運(yùn)動轉(zhuǎn)化為電信號,為各類設(shè)備提供精確的位置和速度
    的頭像 發(fā)表于 08-15 14:20 ?1264次閱讀
    增量式編碼器3大特點(diǎn),工作<b class='flag-5'>模式</b>,精度,輸出脈沖信號 <b class='flag-5'>一起</b>了解<b class='flag-5'>一</b>下嗎

    DAC8771RGZ電流輸出端IOUT和電壓輸VOUT出端是連在一起的,是否可以不并在一起

    請教下DAC8771RGZ這款芯片,看官方demo板,電流輸出端IOUT和電壓輸VOUT出端是連在一起的,是否可以不并在一起,分成兩路,單獨(dú)分別輸出電流或電壓嗎?
    發(fā)表于 08-08 07:59

    普通門電路的輸出端能否連在一起

    普通門電路的輸出端能否連在一起,取決于具體的應(yīng)用場景和需求。普通門電路的輸出端能否連在一起個(gè)復(fù)雜的問題,涉及到數(shù)字電路設(shè)計(jì)、邏輯電路分析、信號完整性、電源管理等多個(gè)方面。 門電路的基本概念 在
    的頭像 發(fā)表于 07-30 15:13 ?1694次閱讀

    可以將USB主機(jī)與Esp8266一起使用嗎?

    我可以將 USB 主機(jī)(USB A 型母頭)與 Esp8266 一起使用嗎? 為什么我不能使用它
    發(fā)表于 07-19 06:49

    如何將atoi與esp8266 sdk一起使用?

    有誰知道如何將 atoi 與 esp8266 sdk 一起使用?我似乎找不到可以提供它的頭文件。 I\'m using \"ESP8266_NONOS_SDK_V1.5.4_16_05_20\"
    發(fā)表于 07-09 07:59
    主站蜘蛛池模板: 香蕉久久夜色精品国产2020 | 黄色软件合集 | 一级特黄aaa大片 | 男人j进女人j的视频一进一出 | 老师今晚让你爽个够 | 中国成人在线视频 | 精品在线一区二区 | 久久久久久久国产视频 | 日本aaaaa特黄毛片 | 日韩高清特级特黄毛片 | 69日本xxxxxxxxx29| 欧美日韩国产网站 | 天天天操天天天干 | 四虎精品成在线播放 | 国产网站在线播放 | 国产欧美亚洲精品 | 男人日女人视频在线观看 | 男人j进入女人免费视频 | 黄色在线观看国产 | 色老头成人免费视频天天综合 | 美女视频黄的免费视频网页 | 人人添人人澡人人澡人人人爽 | 九九国产精品视频 | 欧洲性开放大片免费观看视频 | 国产情侣出租屋露脸实拍 | 不卡视频一区二区 | 夜夜爱夜夜爽夜夜做夜夜欢 | 亚洲一二三区在线观看 | 四虎影库永久在线 | 天天干夜啪 | 亚洲色图第一页 | 久久久久国产成人精品亚洲午夜 | 国产色拍| 国产成人啪精品午夜在线播放 | 欧美黄色免费看 | 欧美骚| 嫩草影院入口一二三免费 | 精品国产第一页 | 欧美性色黄 | 神马午夜在线观看 | 四虎hu|