Chain-of-Responsibility-Muster – Geben Sie mehr als einem Objekt die Möglichkeit, eine Anfrage bearbeiten zu können

Muster der Verantwortungskette – mehr als einem Objekt die Chance geben, eine Anfrage bearbeiten zu können

Vorteile der Verantwortungskette :

  1. Kopplung reduzieren. Es entkoppelt Sender und Empfänger der Anfrage;
  2. Objekte werden vereinfacht. Damit das Objekt die Struktur der Kette nicht kennen muss;
  3. Erhöhte Flexibilität bei der Zuweisung von Verantwortlichkeiten zu Objekten. Ermöglicht das dynamische Hinzufügen oder Löschen von Verantwortlichkeiten durch Ändern von Mitgliedern in der Kette oder Mobilisieren ihrer Reihenfolge;
  4. Es ist praktisch, neue Request-Handler-Klassen hinzuzufügen.

Nachteile der Verantwortungskette:

  1. Die Anfrage hat keinen eindeutigen Empfänger, es gibt keine Garantie dafür, dass sie verarbeitet wird, und die Anfrage wird möglicherweise erst am Ende der Kette verarbeitet;
  2. Bei einer relativ langen Verantwortungskette kann die Verarbeitung der Anforderung mehrere Verarbeitungsobjekte umfassen, die Systemleistung wird bis zu einem gewissen Grad beeinträchtigt und das Debuggen von Code ist nicht praktisch, was zu zirkulären Aufrufen führen kann

Es gibt zwei Formen der Verantwortungskette: den
reinen Verantwortungskettenmodus und den unreinen Verantwortungskettenmodus.

Wenn eine Klasse entweder dafür verantwortlich ist, die Anfrage zu verarbeiten oder die Anfrage an den nächsten Ball weiterzuleiten, spricht man von einem reinen Verantwortungskettenmuster. Wenn eine Klasse einen Teil der Verantwortung übernimmt und die Anfrage an den nächsten Ball weiterleitet, spricht man von einem unreinen Muster Modell der Verantwortungskette. Es ist schwierig, praktische Beispiele für das Modell der reinen Verantwortungskette zu finden, und die allgemein gesehenen Beispiele sind die Umsetzung des Modells der unreinen Verantwortungskette.

Beispielhafte Nutzungsszenarien:

Klicken Sie beispielsweise auf eine Anzeige, um zu springen.
Die bestehenden Regeln lauten wie folgt: Wenn Sie auf eine Anzeige klicken, beurteilen Sie zunächst, ob Bedingung A erfüllt ist. Wenn A erfüllt ist, versuchen Sie, zuerst mit Methode A zu springen. Wenn Methode A nicht springt, versuchen Sie es erneut mit Methode B.

Codebeispiel:
abstrakte Basisklasse: Jump.java
bietet abstrakte Methoden, Jump Jump, und jede Unterklasse implementiert gemäß den Regeln unterschiedliche Logik .

public abstract class Jump {
    
    
    private Jump mNext;

    abstract boolean jump(Activity activity, MimoAdInfo adInfo);

    public void setNext(Jump next) {
    
    
        this.mNext = next;
    }


    protected void onSuccess(MimoAdInfo adInfo) {
    
    
    }

    protected void onFail(MimoAdInfo adInfo) {
    
    
    }

    public final boolean start(Activity activity, MimoAdInfo adInfo) {
    
    
        boolean success = jump(activity, adInfo);
        if (success) {
    
    
            onSuccess(adInfo);
            return true;
        }
        if (mNext != null) {
    
    
            return mNext.start(activity, adInfo);
        }
        onFail(adInfo);
        return false;
    }
}

Unterklasse: DeepLinkJump.java

public class DeepLinkJump extends Jump{
    
    
    @Override
    boolean jump(Activity activity, MimoAdInfo adInfo) {
    
    
        if (adInfo != null && !TextUtils.isEmpty(adInfo.mDeepLink)) {
    
    
            try {
    
    
                final Uri contentUrl = Uri.parse(adInfo.mDeepLink);
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_VIEW);
                intent.setData(contentUrl);
                MimoAdManager.get().trackLauchStart(adInfo);
                boolean success = IntentUtils.startActivity(activity, intent);
                return success;
            } catch (Exception e) {
    
    
                return false;
            }
        }
        return false;
    }

    @Override
    protected void onSuccess(MimoAdInfo adInfo) {
    
    
        MimoAdManager.get().trackLauchSuccess(adInfo);
    }

    @Override
    protected void onFail(MimoAdInfo adInfo) {
    
    
        MimoAdManager.get().trackLauchFail(adInfo);
    }
}

Unterklasse: LandingPageJump.java

public class LandingPageJump extends Jump{
    
    
    @Override
    public boolean jump(Activity activity, MimoAdInfo adInfo) {
    
    
        if (adInfo != null && !TextUtils.isEmpty(adInfo.mLandingPageUrl)) {
    
    
            try {
    
    
                if (adInfo.mLandingPageUrl.startsWith("http://") || adInfo.mLandingPageUrl.startsWith("https://")) {
    
    
                    LandingPageHelper.land(adInfo.mLandingPageUrl);
                } else {
    
    
                    final Uri contentUrl = Uri.parse(adInfo.mLandingPageUrl);
                    Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_VIEW);
                    intent.setData(contentUrl);
                    return IntentUtils.startActivity(activity, intent);
                }
            } catch (Throwable throwable) {
    
    
                return false;
            }
            return true;
        }
        return false;
    }
}

Unterklasse: FloatCardDataJump.java

public class FloatCardDataJump extends Jump{
    
    
    @Override
    boolean jump(Activity activity, MimoAdInfo adInfo) {
    
    
        if (adInfo != null && !TextUtils.isEmpty(adInfo.mFloatCardData)) {
    
    
            try {
    
    
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_VIEW);
                final Uri contentUrl = Uri.parse(adInfo.mFloatCardData);
                intent.setData(contentUrl);
                boolean success = IntentUtils.startActivity(activity, intent);
                return success;
            } catch (Exception e) {
    
    
                return false;
            }
        }
        return false;
    }
}

Beispiel für einen Client-Nutzungscode:

/**
     * 点击按钮区域 先读取floatcarddata,如果取不到该字段,再读取landingpageurl
     * @param adInfo
     */
    public static boolean jumpDownloadByFloatCardDataFirst(MimoAdInfo adInfo) {
    
    
        if (adInfo != null && !TextUtils.isEmpty(adInfo.mFloatCardData)) {
    
    
            FloatCardDataJump floatCardDataJump = new FloatCardDataJump();
            floatCardDataJump.setNext(new LandingPageJump());
            return floatCardDataJump.start(DkApp.get().getTopActivity(), adInfo);
        } else {
    
    
            LandingPageJump landingPageJump = new LandingPageJump();
            return landingPageJump.jump(DkApp.get().getTopActivity(), adInfo);
        }
    }

Guess you like

Origin blog.csdn.net/adayabetter/article/details/112513621