偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

一文搞懂設(shè)計(jì)模式—代理模式

開(kāi)發(fā) 前端
總的來(lái)說(shuō),代理模式通過(guò)引入代理對(duì)象,實(shí)現(xiàn)了對(duì)真實(shí)對(duì)象的間接訪(fǎng)問(wèn)和控制,為系統(tǒng)的設(shè)計(jì)提供了一種簡(jiǎn)潔而有效的解決方案。在日常的軟件開(kāi)發(fā)中,合理地運(yùn)用代理模式可以為系統(tǒng)帶來(lái)更好的結(jié)構(gòu)和性能表現(xiàn)。

代理模式(Proxy Pattern)是一種結(jié)構(gòu)型設(shè)計(jì)模式,也叫做委托模式,它允許你提供一個(gè)間接訪(fǎng)問(wèn)對(duì)象的方式。

用一句話(huà)描述代理模式就是:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪(fǎng)問(wèn)

使用場(chǎng)景

  • 遠(yuǎn)程代理(Remote Proxy):用于在不同地址空間中代表對(duì)象,使得客戶(hù)端可以訪(fǎng)問(wèn)遠(yuǎn)程的對(duì)象。
  • 虛擬代理(Virtual Proxy):用于按需創(chuàng)建昂貴對(duì)象的代表,延遲對(duì)象的實(shí)例化,提高系統(tǒng)性能。
  • 保護(hù)代理(Protection Proxy):用于控制對(duì)真實(shí)對(duì)象的訪(fǎng)問(wèn)權(quán)限,在訪(fǎng)問(wèn)真實(shí)對(duì)象之前進(jìn)行安全檢查。
  • 智能引用(Smart Reference):用于在訪(fǎng)問(wèn)對(duì)象時(shí)執(zhí)行額外的操作,如引用計(jì)數(shù)、懶加載等。
  • 日志記錄(Logging Proxy):用于記錄方法調(diào)用的日志信息,方便調(diào)試和監(jiān)控系統(tǒng)運(yùn)行狀態(tài)。
  • 權(quán)限控制(Access Control Proxy):用于控制用戶(hù)對(duì)對(duì)象的訪(fǎng)問(wèn)權(quán)限,限制某些用戶(hù)的操作。
  • 延遲加載(Lazy Loading Proxy):用于延遲加載對(duì)象的數(shù)據(jù),直到真正需要使用時(shí)才進(jìn)行加載。

代理模式在Java中的Spring框架和Dubbo框架中都有廣泛的應(yīng)用:

  • Spring框架中的AOP(面向切面編程):Spring使用代理模式實(shí)現(xiàn)AOP功能,允許開(kāi)發(fā)者定義切面(Aspect),并通過(guò)代理機(jī)制將切面織入到目標(biāo)對(duì)象的方法調(diào)用中,實(shí)現(xiàn)橫切關(guān)注點(diǎn)的管理,如日志記錄、事務(wù)管理等。
  • Dubbo框架中的遠(yuǎn)程服務(wù)代理:Dubbo是一種高性能的分布式服務(wù)框架,其中的服務(wù)消費(fèi)者與服務(wù)提供者之間的通信通過(guò)代理模式來(lái)實(shí)現(xiàn)。Dubbo會(huì)根據(jù)配置信息動(dòng)態(tài)生成接口的代理實(shí)現(xiàn)類(lèi),在遠(yuǎn)程調(diào)用時(shí)通過(guò)代理對(duì)象進(jìn)行通信,隱藏了遠(yuǎn)程調(diào)用的復(fù)雜性,使得調(diào)用方可以像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程服務(wù)。

通過(guò)代理模式,可以實(shí)現(xiàn)對(duì)對(duì)象的訪(fǎng)問(wèn)控制、附加功能增強(qiáng)、性能優(yōu)化等目的,提高系統(tǒng)的靈活性、可維護(hù)性和可擴(kuò)展性。

具體實(shí)現(xiàn)

代理模式涉及以下幾個(gè)角色:

  • 抽象主題(Subject):是一個(gè)接口或抽象類(lèi),定義了真實(shí)主題和代理對(duì)象共同實(shí)現(xiàn)的方法,客戶(hù)端通過(guò)抽象主題訪(fǎng)問(wèn)真實(shí)主題。
  • 真實(shí)主題(Real Subject):是真正執(zhí)行業(yè)務(wù)邏輯的對(duì)象,實(shí)現(xiàn)了抽象主題定義的方法,是代理模式中被代理的對(duì)象。
  • 代理(Proxy):持有對(duì)真實(shí)主題的引用,可以控制對(duì)真實(shí)主題的訪(fǎng)問(wèn),在其自身的方法中可以調(diào)用真實(shí)主題的方法,同時(shí)也可以在調(diào)用前后執(zhí)行一些附加操作。

實(shí)現(xiàn)代理模式步驟如下:

首先定義一個(gè)接口:

public interface Subject {
    void request();
}

然后實(shí)現(xiàn)真實(shí)主題類(lèi):

public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("Real Subject handles the request.");
    }
}

接著創(chuàng)建代理類(lèi):

public class Proxy implements Subject {
    private RealSubject realSubject;

    @Override
    public void request() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        preRequest();
        realSubject.request();
        postRequest();
    }
    //前置處理
    private void preRequest() {
        System.out.println("Proxy performs pre-request actions.");
    }
    //后置處理
    private void postRequest() {
        System.out.println("Proxy performs post-request actions.");
    }
}

客戶(hù)端調(diào)用:

public static void main(String[] args) {
        Proxy proxy = new Proxy();
        proxy.request();
    }

輸出:

Proxy performs pre-request actions.
Real Subject handles the request.
Proxy performs post-request actions.

Tips:一個(gè)代理類(lèi),可以代理多個(gè)真實(shí)角色,并且真實(shí)角色之間允許有耦合關(guān)系。

普通代理 & 強(qiáng)制代理

在代理模式中,可以區(qū)分普通代理和強(qiáng)制代理:

  • 普通代理(Normal Proxy):由代理類(lèi)控制對(duì)真實(shí)主題的訪(fǎng)問(wèn),客戶(hù)端直接與代理類(lèi)交互,代理類(lèi)負(fù)責(zé)將請(qǐng)求轉(zhuǎn)發(fā)給真實(shí)主題,調(diào)用者只知代理而不用知道真實(shí)的角色是誰(shuí),屏蔽了真實(shí)角色的變更對(duì)高層模塊的影響。
  • 強(qiáng)制代理(Force Proxy):“強(qiáng)制”必須通過(guò)真實(shí)角色查找到代理角色,否則不能訪(fǎng)問(wèn)。并且只有通過(guò)真實(shí)角色指定的代理類(lèi)才可以訪(fǎng)問(wèn),也就是說(shuō)由真實(shí)角色管理代理角色。強(qiáng)制代理不需要產(chǎn)生一個(gè)代理出來(lái),代理的管理由真實(shí)角色自己完成。

上面提供的代碼例子就是普通代理,下面用代碼演示下強(qiáng)制代理:

// 抽象主題接口
public interface Subject {
    /**
     * 待具體實(shí)現(xiàn)的方法
     */
    void request();

    /**
     * 獲取每個(gè)具體實(shí)現(xiàn)對(duì)應(yīng)的代理對(duì)象實(shí)例
     * @return 返回對(duì)應(yīng)的代理對(duì)象
     */
    Subject getProxy();
}


// 強(qiáng)制代理對(duì)象
public class ForceProxy implements Subject {

    private Subject subject;

    public ForceProxy(Subject subject) {
        this.subject = subject;
    }

    /**
     * 待具體實(shí)現(xiàn)的方法
     */
    @Override
    public void request() {
        preRequest();
        subject.request();
        postRequest();
    }

    /**
     * @return 返回對(duì)應(yīng)的代理對(duì)象就是自己
     */
    @Override
    public Subject getProxy() {
        return this;
    }

    private void postRequest() {
        System.out.println("訪(fǎng)問(wèn)真實(shí)主題以后的后續(xù)處理");
    }

    private void preRequest() {
        System.out.println("訪(fǎng)問(wèn)真實(shí)主題之前的預(yù)處理");
    }
}


// 具體的實(shí)現(xiàn)對(duì)象
public class RealSubject implements Subject {

    /**
     * 該具體實(shí)現(xiàn)對(duì)象的代理對(duì)象
     */
    private Subject proxy;

    @Override
    public Subject getProxy() {
        proxy = new ForceProxy(this);
        return proxy;
    }

    /**
     * 待具體實(shí)現(xiàn)的方法
     */
    @Override
    public void request() {
        if (isProxy()) {
            System.out.println("訪(fǎng)問(wèn)真實(shí)主題方法");
        } else {
            System.out.println("請(qǐng)使用指定的代理訪(fǎng)問(wèn)");
        }
    }

    private boolean isProxy() {
        return proxy != null;
    }
}

客戶(hù)端調(diào)用:

public static void main(String[] args) {
        Subject subject = new RealSubject();
        subject.request();
    }
    Output:
    請(qǐng)使用指定的代理訪(fǎng)問(wèn)
      
      
      
    public static void main(String[] args) {
        Subject subject = new RealSubject();
        Subject proxy = new ForceProxy(subject);
        proxy.request();
    }
    Output:
    訪(fǎng)問(wèn)真實(shí)主題之前的預(yù)處理
    請(qǐng)使用指定的代理訪(fǎng)問(wèn)
    訪(fǎng)問(wèn)真實(shí)主題以后的后續(xù)處理
      
      
      
  public static void main(String[] args) {
        Subject subject = new RealSubject();
        Subject proxy = subject.getProxy();
        proxy.request();
    }
    Output:
    訪(fǎng)問(wèn)真實(shí)主題之前的預(yù)處理
    訪(fǎng)問(wèn)真實(shí)主題方法
    訪(fǎng)問(wèn)真實(shí)主題以后的后續(xù)處理

通過(guò)代碼可以觀(guān)察到,強(qiáng)制代理模式下,不允許通過(guò)真實(shí)角色來(lái)直接訪(fǎng)問(wèn),只有通過(guò)真實(shí)角色來(lái)獲取代理對(duì)象,才能訪(fǎng)問(wèn)。

高層模塊只需調(diào)用getProxy就可以訪(fǎng)問(wèn)真實(shí)角色的所有方法,它根本就不需要產(chǎn)生一個(gè)代理出來(lái),代理的管理已經(jīng)由真實(shí)角色自己完成。

動(dòng)態(tài)代理

前面講的普通代理和強(qiáng)制代理都屬于靜態(tài)代理,也就是說(shuō)自己寫(xiě)代理類(lèi)的方式就是靜態(tài)代理。

靜態(tài)代理有一個(gè)缺點(diǎn)就是要在實(shí)現(xiàn)階段就要指定代理類(lèi)以及被代理者,很不靈活。

而動(dòng)態(tài)代理是一種在運(yùn)行時(shí)動(dòng)態(tài)生成代理類(lèi)的機(jī)制,可以在不預(yù)先知道接口的情況下動(dòng)態(tài)創(chuàng)建接口的實(shí)現(xiàn)類(lèi),允許在運(yùn)行階段才指定代理哪一個(gè)對(duì)象,比如Spring AOP就是非常經(jīng)典的動(dòng)態(tài)代理的應(yīng)用

下面是兩個(gè)動(dòng)態(tài)代理常用的實(shí)現(xiàn)方式:

  • JDK 動(dòng)態(tài)代理 :基于 Java 反射機(jī)制,在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建代理類(lèi)和對(duì)象。JDK 動(dòng)態(tài)代理要求被代理的類(lèi)實(shí)現(xiàn)一個(gè)或多個(gè)接口,通過(guò) java.lang.reflect.Proxy 和 java.lang.reflect.InvocationHandler 接口來(lái)實(shí)現(xiàn)代理對(duì)象的生成和方法調(diào)用。
  • CGLIB 動(dòng)態(tài)代理:不要求被代理的類(lèi)實(shí)現(xiàn)接口,通過(guò)繼承被代理類(lèi)來(lái)生成代理對(duì)象。CGLIB 使用字節(jié)碼生成庫(kù)ASM來(lái)動(dòng)態(tài)生成代理類(lèi),因此性能略高于 JDK 動(dòng)態(tài)代理。

JDK動(dòng)態(tài)代理

JDK實(shí)現(xiàn)動(dòng)態(tài)代理的核心機(jī)制就是java.lang.reflect.Proxy類(lèi)和java.lang.reflect.InvocationHandler接口。

JDK動(dòng)態(tài)代理的動(dòng)態(tài)代理類(lèi)需要去實(shí)現(xiàn)JDK自帶的java.lang.reflect.InvocationHandler接口,該接口中的invoke()方法能夠讓動(dòng)態(tài)代理類(lèi)實(shí)例在運(yùn)行時(shí)調(diào)用被代理類(lèi)需要對(duì)外實(shí)現(xiàn)的所有接口中的方法,也就是完成對(duì)真實(shí)主題類(lèi)方法的調(diào)用。

具體實(shí)現(xiàn)步驟如下:

  1. 創(chuàng)建一個(gè)接口Subject表示被代理的對(duì)象需要實(shí)現(xiàn)的方法。
  2. 創(chuàng)建一個(gè)真實(shí)主題類(lèi)RealSubject,實(shí)現(xiàn)Subject接口,定義真正的業(yè)務(wù)邏輯。
  3. 創(chuàng)建一個(gè)實(shí)現(xiàn)InvocationHandler接口的代理處理器類(lèi)DynamicProxyHandler,在invoke方法中執(zhí)行額外的操作,并調(diào)用真實(shí)主題的方法。
  4. 在主程序中使用Proxy.newProxyInstance()方法動(dòng)態(tài)生成代理對(duì)象,并調(diào)用代理對(duì)象的方法。

下面是動(dòng)態(tài)代理的示例代碼,一起來(lái)感受一下:

// 1. 創(chuàng)建接口
public interface Subject {
    void request();
}

// 2. 創(chuàng)建真實(shí)主題類(lèi)
public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("RealSubject handles the request.");
    }
}

// 3. 創(chuàng)建代理處理器類(lèi)
public class DynamicProxyHandler implements InvocationHandler {
    private Object target;

    DynamicProxyHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 執(zhí)行額外操作
        System.out.println("Before requesting...");
        
        // 調(diào)用真實(shí)主題對(duì)象的方法
        Object result = method.invoke(target, args);
        
        // 執(zhí)行額外操作
        System.out.println("After requesting...");
        
        return result;
    }
}

public class DynamicProxyExample {

    public static void main(String[] args) {
        // 創(chuàng)建真實(shí)主題對(duì)象
        Subject realSubject = new RealSubject();

        // 創(chuàng)建代理處理器對(duì)象
        InvocationHandler handler = new DynamicProxyHandler(realSubject);

        // 創(chuàng)建動(dòng)態(tài)代理對(duì)象
        Subject proxy = (Subject) Proxy.newProxyInstance(
                realSubject.getClass().getClassLoader(),
                realSubject.getClass().getInterfaces(),
                handler);

        // 調(diào)用代理對(duì)象的方法
        proxy.request();
    }
}

這段代碼演示了使用 JDK 動(dòng)態(tài)代理實(shí)現(xiàn)動(dòng)態(tài)代理的過(guò)程:

  1. 首先,創(chuàng)建了一個(gè)真實(shí)主題對(duì)象 realSubject,表示被代理的真實(shí)對(duì)象。
  2. 接著,創(chuàng)建了一個(gè)代理處理器對(duì)象 handler,類(lèi)型為 InvocationHandler,并將真實(shí)主題對(duì)象傳入代理處理器中,用于處理代理對(duì)象的方法調(diào)用。
  3. 然后,通過(guò) Proxy.newProxyInstance() 方法創(chuàng)建了一個(gè)動(dòng)態(tài)代理對(duì)象 proxy,該方法接受三個(gè)參數(shù):
  • 類(lèi)加載器:使用真實(shí)主題對(duì)象的類(lèi)加載器。
  • 接口數(shù)組:指定代理對(duì)象需要實(shí)現(xiàn)的接口,這里使用真實(shí)主題對(duì)象的接口數(shù)組。
  • 處理器:指定代理對(duì)象的調(diào)用處理器,即前面創(chuàng)建的代理處理器對(duì)象 handler。
  1. 最后,通過(guò)代理對(duì)象 proxy 調(diào)用 request() 方法,實(shí)際上會(huì)委托給代理處理器 handler 的 invoke() 方法來(lái)處理方法調(diào)用,進(jìn)而調(diào)用真實(shí)主題對(duì)象的對(duì)應(yīng)方法。

這段代碼通過(guò) JDK 動(dòng)態(tài)代理機(jī)制實(shí)現(xiàn)了代理對(duì)象的動(dòng)態(tài)創(chuàng)建和方法調(diào)用處理,實(shí)現(xiàn)了對(duì)真實(shí)主題對(duì)象的間接訪(fǎng)問(wèn),并在調(diào)用真實(shí)主題對(duì)象方法前后進(jìn)行了額外的處理。

其動(dòng)態(tài)調(diào)用過(guò)程如圖所示:

cglib動(dòng)態(tài)代理

JDK的動(dòng)態(tài)代理機(jī)制只能代理實(shí)現(xiàn)了接口的類(lèi),否則不能實(shí)現(xiàn)JDK的動(dòng)態(tài)代理,具有一定的局限性。

CGLIB(Code Generation Library)是一個(gè)功能強(qiáng)大的字節(jié)碼生成庫(kù),可以用來(lái)在運(yùn)行時(shí)擴(kuò)展Java類(lèi)和實(shí)現(xiàn)動(dòng)態(tài)代理。

相對(duì)于JDK動(dòng)態(tài)代理基于接口的代理,cglib動(dòng)態(tài)代理基于子類(lèi)的代理,可以代理那些沒(méi)有接口的類(lèi),通俗說(shuō)cglib可以在運(yùn)行時(shí)動(dòng)態(tài)生成字節(jié)碼。

cglib的原理是對(duì)指定的目標(biāo)類(lèi)生成一個(gè)子類(lèi),并覆蓋其中方法實(shí)現(xiàn)增強(qiáng),因?yàn)椴捎玫氖抢^承,所以不能對(duì)final修飾符的類(lèi)進(jìn)行代理。

下面是一個(gè)使用cglib實(shí)現(xiàn)動(dòng)態(tài)代理的示例代碼,包括實(shí)現(xiàn)步驟:

  1. 創(chuàng)建一個(gè)真實(shí)主題類(lèi)RealSubject,無(wú)需實(shí)現(xiàn)任何接口。
  2. 創(chuàng)建一個(gè)實(shí)現(xiàn)MethodInterceptor接口的代理處理器類(lèi)DynamicProxyHandler,在intercept方法中執(zhí)行額外的操作,并調(diào)用真實(shí)主題的方法。
  3. 在主程序中使用Enhancer類(lèi)創(chuàng)建代理對(duì)象,并設(shè)置代理處理器。

使用 cglib 需要添加對(duì)應(yīng)的依賴(lài):

<!-- https://mvnrepository.com/artifact/cglib/cglib -->
<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.3.0</version>
</dependency>
// 1. 創(chuàng)建真實(shí)主題類(lèi)
public class RealSubject {
    public void request() {
        System.out.println("RealSubject handles the request.");
    }
}

// 2. 創(chuàng)建代理處理器類(lèi)
public class DynamicProxyHandler implements MethodInterceptor {

    /**
     * 通過(guò)Enhancer 創(chuàng)建代理對(duì)象
     */
    private Enhancer enhancer = new Enhancer();

    /**
     * 通過(guò)class對(duì)象獲取代理對(duì)象
     * @param clazz class對(duì)象
     * @return 代理對(duì)象
     */
    public Object getProxy(Class<?> clazz) {
        // 設(shè)置需要代理的類(lèi)
        enhancer.setSuperclass(clazz);
        // 設(shè)置enhancer的回調(diào)
        enhancer.setCallback(this);
        return enhancer.create();
    }
  
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        // 執(zhí)行額外操作
        System.out.println("Before requesting...");

        // 調(diào)用真實(shí)主題對(duì)象的方法
        Object result = proxy.invokeSuper(obj, args);

        // 執(zhí)行額外操作
        System.out.println("After requesting...");

        return result;
    }
}

public class CglibProxyExample {
    public static void main(String[] args) {
        DynamicProxyHandler proxy = new DynamicProxyHandler();
        RealSubject realSubject = (RealSubject) proxy.getProxy(RealSubject.class);

        // 調(diào)用代理對(duì)象的方法
        realSubject.request();
    }
}

輸出:

Before requesting...
RealSubject handles the request.
After requesting...

cglib動(dòng)態(tài)代理相比于JDK動(dòng)態(tài)代理的優(yōu)缺點(diǎn)如下:

優(yōu)點(diǎn):

  • 可以代理沒(méi)有實(shí)現(xiàn)接口的類(lèi)。
  • 性能更高,因?yàn)橹苯硬僮髯止?jié)碼,無(wú)需反射。

缺點(diǎn):

  • 生成的代理類(lèi)會(huì)繼承被代理類(lèi),可能會(huì)影響某些設(shè)計(jì)。
  • 無(wú)法代理static方法,因?yàn)閏glib是基于繼承來(lái)生成代理類(lèi)的,而靜態(tài)方法是屬于類(lèi)而非對(duì)象的
  • 對(duì)于final方法,cglib無(wú)法覆蓋,仍然會(huì)調(diào)用父類(lèi)方法。

總結(jié)

代理模式是一種常用的設(shè)計(jì)模式,在軟件開(kāi)發(fā)中有著廣泛的應(yīng)用。通過(guò)引入代理對(duì)象,可以實(shí)現(xiàn)對(duì)真實(shí)對(duì)象的訪(fǎng)問(wèn)控制、附加功能增強(qiáng)、性能優(yōu)化等目的。

優(yōu)點(diǎn)

  • 可以控制對(duì)真實(shí)對(duì)象的訪(fǎng)問(wèn),在不改變?cè)碱?lèi)代碼的情況下擴(kuò)展其行為。
  • 代理模式能將客戶(hù)端與目標(biāo)對(duì)象分離,在一定程序上降低了系統(tǒng)的耦合度.

缺點(diǎn)

  • 增加了系統(tǒng)復(fù)雜性,引入了多余的代理類(lèi),因此有些類(lèi)型的代理模式可能會(huì)造成請(qǐng)求的處理速度變慢。
  • 實(shí)現(xiàn)代理模式需要額外的工作,有些代理模式的實(shí)現(xiàn)非常復(fù)雜。

總的來(lái)說(shuō),代理模式通過(guò)引入代理對(duì)象,實(shí)現(xiàn)了對(duì)真實(shí)對(duì)象的間接訪(fǎng)問(wèn)和控制,為系統(tǒng)的設(shè)計(jì)提供了一種簡(jiǎn)潔而有效的解決方案。在日常的軟件開(kāi)發(fā)中,合理地運(yùn)用代理模式可以為系統(tǒng)帶來(lái)更好的結(jié)構(gòu)和性能表現(xiàn)。

責(zé)任編輯:武曉燕 來(lái)源: Java隨想錄
相關(guān)推薦

2024-02-19 13:11:38

門(mén)面模式系統(tǒng)

2024-01-29 12:22:07

設(shè)計(jì)模式策略模式

2023-05-22 13:27:17

2024-01-30 13:15:00

設(shè)計(jì)模式責(zé)任鏈

2024-02-21 12:24:33

模板設(shè)計(jì)模式框架

2024-02-23 12:11:53

裝飾器模式對(duì)象

2024-02-04 12:04:17

2024-02-27 11:59:12

享元模式對(duì)象

2024-02-18 12:36:09

2024-02-22 12:13:49

適配器模式代碼

2024-02-20 12:09:32

模式工廠(chǎng)方法接口

2022-05-05 16:47:24

Docker網(wǎng)絡(luò)空間容器

2022-09-21 16:56:16

設(shè)計(jì)模式微服務(wù)架構(gòu)

2022-03-24 08:51:48

Redis互聯(lián)網(wǎng)NoSQL

2020-11-17 09:32:57

設(shè)計(jì)模式責(zé)任鏈

2024-04-12 12:19:08

語(yǔ)言模型AI

2024-06-26 10:29:02

商品中心設(shè)計(jì)生成器

2020-11-10 09:20:40

開(kāi)發(fā)模式代碼

2012-02-29 09:41:14

JavaScript

2012-01-13 15:59:07

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)