Heim  >  Artikel  >  Java  >  Hinweise zum Agentenmuster von Java Design Patterns

Hinweise zum Agentenmuster von Java Design Patterns

黄舟
黄舟Original
2017-10-18 09:39:001140Durchsuche

In diesem Artikel werden hauptsächlich die Hinweise zum Proxy-Modus des Java-Entwurfsmusters ausführlich vorgestellt, die einen gewissen Referenzwert haben. Interessierte Freunde können sich auf den

Proxy-Modus (Proxy) beziehen:

Das Proxy-Muster ist ein Strukturmuster für Objekte. Das Proxy-Muster stellt ein Proxy-Objekt für ein Objekt bereit und das Proxy-Objekt steuert den Verweis auf das Originalobjekt.

Kernfunktion:

Zugriff auf Objekte über Proxys steuern.

Sie können die Methode für den Zugriff auf ein bestimmtes Objekt (eines bestimmten Typs) im Detail steuern, vor dem Aufruf dieser Methode eine Vorverarbeitung durchführen und nach dem Aufruf dieser Methode eine Nachverarbeitung durchführen. Das heißt, die Mikroimplementierung von AOP.

Der Kernimplementierungsmechanismus von AOP (Aspect Oriented Programming).

Szenen im Leben:

Die sogenannte Agentur liegt vor, wenn eine Person oder Institution im Namen einer anderen Person oder Institution handelt. In manchen Fällen möchte oder kann ein Client ein Objekt nicht direkt referenzieren, und ein Proxy-Objekt kann als Vermittler zwischen dem Client und dem Zielobjekt fungieren.
Wenn ein Kunde beispielsweise einen Star zum Singen finden möchte, muss er zuerst seinen Agenten finden, und dann wird dieser dafür sorgen, dass der Star singt.
Der Agent muss einige Vorarbeiten vor dem Konzert erledigen (Interviews, Vertragsgestaltung, Unterzeichnung, Einzug der Vorauszahlung, Organisation von Flugtickets und Fahrzeugen usw.) und muss sich um einige Nachbearbeitungen (Abschlusszahlung usw.) kümmern. ) nach dem Konzert. Zu diesem Zeitpunkt muss sich ein bestimmter Star (echter Charakter) nur um das Singen kümmern, alle anderen Angelegenheiten bleiben dem Manager (Agenten) überlassen.

Kernrolle:

Bildbeschreibung hier schreiben

Abstrakte Objektrolle: Deklariert die gemeinsame Schnittstelle zwischen Proxy-Objekten und realen Objekten, definiert Proxy-Objekte und Öffentliche externe Methoden realer Objekte. Dadurch kann das Proxy-Objekt überall dort verwendet werden, wo ein reales Objekt verwendet werden kann.

Rolle des realen Objekts: Definiert das reale Objekt, das durch das Proxy-Objekt dargestellt wird. Implementieren Sie abstrakte Objekte und definieren Sie die Geschäftslogik, die von realen Objekten für Aufrufe von Proxy-Objekten implementiert werden muss. Konzentrieren Sie sich auf echte Geschäftslogik.

Proxy-Objektrolle: implementiert abstrakte Objekte und ist ein Proxy für reale Objekte. Es implementiert abstrakte Methoden durch die Geschäftslogikmethoden realer Objekte und fügt eigene Operationen hinzu. Integrieren Sie eine einheitliche Prozesssteuerung in Proxy-Objekte.

Das Proxy-Objekt enthält intern einen Verweis auf das reale Objekt, sodass das reale Objekt jederzeit bedient werden kann jederzeit austauschbar. Das Proxy-Objekt führt normalerweise eine Operation aus, bevor oder nachdem der Client-Aufruf an das reale Objekt übergeben wird, anstatt den Aufruf einfach an das reale Objekt weiterzuleiten.

Anwendungsszenarien:

Sicherheits-Proxy: Blockieren Sie den direkten Zugriff auf echte Charaktere.
Remote-Proxy: Verarbeiten Sie Remote-Methodenaufrufe über Proxy-Klassen.
Verzögertes Laden: Laden Sie zuerst leichte Proxy-Objekte und dann bei Bedarf echte Objekte. (Verzögertes Laden von Bildern)

Kategorie:

Statischer Proxy: (statisch definierte Proxy-Klasse)

Code für das obige Beispiel:

1. Deklariert die gemeinsame Schnittstelle zwischen dem Proxy-Objekt und dem realen Objekt und definiert die öffentlichen externen Methoden des Proxy-Objekts und des realen Objekts.


public interface Star {
  /**
   * 面谈
   */
  void confer();
  /**
   * 签合同
   */
  void signContract();
  /**
   * 订票
   */
  void bookTicket();
  /**
   * 唱歌
   */
  void sing();
  /**
   * 收钱
   */
  void collectMoney();
}

2. Definieren Sie eine echte Objektklasse und implementieren Sie die von der abstrakten Schnittstelle bereitgestellten Methoden.


public class RealStar implements Star {

  @Override
  public void bookTicket() {
    System.out.println("RealStar.bookTicket()");
  }

  @Override
  public void collectMoney() {
    System.out.println("RealStar.collectMoney()");
  }

  @Override
  public void confer() {
    System.out.println("RealStar.confer()");
  }

  @Override
  public void signContract() {
    System.out.println("RealStar.signContract()");
  }

  @Override
  public void sing() {
    System.out.println("RealStar.sing()");
  }
}

3. Definieren Sie eine Proxy-Objektklasse, implementieren Sie die von der abstrakten Schnittstelle bereitgestellten Methoden und halten Sie einen Verweis auf das reale Objekt.


public class ProxyStar implements Star{

private Star star;

  public ProxyStar(Star star) {
    super();
    this.star = star;
  }

  @Override
  public void bookTicket() {
    System.out.println("ProxyStar.bookTicket()");
  }

  @Override
  public void collectMoney() {
    System.out.println("ProxyStar.collectMoney()");
  }

  @Override
  public void confer() {
    System.out.println("ProxyStar.confer()");
  }

  @Override
  public void signContract() {
    System.out.println("ProxyStar.signContract()");
  }

  @Override
  public void sing() {
    star.sing();
  }

}

4. Testklasse


public class Client {
  public static void main(String[] args) {
    //定义真实对象角色
    Star realStar = new RealStar();
    //定义代理对象角色,内部含有真实对象的引用
    Star proxyStar = new ProxyStar(realStar);

    proxyStar.confer();
    proxyStar.signContract();
    proxyStar.bookTicket();
    proxyStar.sing();
    proxyStar.collectMoney();

  }
}

Die Laufergebnisse sind wie folgt:


ProxyStar.confer()
ProxyStar.signContract()
ProxyStar.bookTicket()
RealStar.sing()
ProxyStar.collectMoney()

Aus dem obigen Beispiel können wir ersehen, dass das Proxy-Objekt den Aufruf des Clients an das reale Objekt delegiert und bestimmte Vorgänge vor und nach dem Aufruf der Methode des Ziels ausführen kann Objekt.

Dynamischer Proxy: (dynamisch generierte Proxy-Klasse):

Vorteile des dynamischen Proxys gegenüber dem statischen Proxy:

In abstrakter Rolle Alle Deklarierte Methoden (Schnittstelle) werden an eine zentrale Methode zum Aufrufen des Servers zur Verarbeitung übergeben, sodass wir zahlreiche Methoden flexibler und einheitlicher handhaben können.

Dynamischer Proxy, der mit JDK geliefert wird

java.lang.reflect.Proxy
Proxy-Klassen und -Objekte dynamisch generieren

java.lang.reflect.InvocationHandler (Prozessorschnittstelle)
Proxy-Zugriff auf echte Rollen kann über die Aufrufmethode erreicht werden

Generieren Sie jeweils eine Proxy-Klasse über Proxy Das Zeitobjekt muss das entsprechende Prozessorobjekt angeben.

Der Testcode lautet wie folgt:

1 Deklariert die gemeinsame Schnittstelle des Proxy-Objekts und des realen Objekts und definiert die öffentlichen externen Methoden Proxy-Objekt und das reale Objekt.


public interface Star {
  /**
   * 面谈
   */
  void confer();
  /**
   * 签合同
   */
  void signContract();
  /**
   * 订票
   */
  void bookTicket();
  /**
   * 唱歌
   */
  void sing();
  /**
   * 收钱
   */
  void collectMoney();
}

2. Definieren Sie eine echte Objektklasse und implementieren Sie die von der abstrakten Schnittstelle bereitgestellten Methoden.


public class RealStar implements Star {

  @Override
  public void bookTicket() {
    System.out.println("RealStar.bookTicket()");
  }

  @Override
  public void collectMoney() {
    System.out.println("RealStar.collectMoney()");
  }

  @Override
  public void confer() {
    System.out.println("RealStar.confer()");
  }

  @Override
  public void signContract() {
    System.out.println("RealStar.signContract()");
  }

  @Override
  public void sing() {
    System.out.println("RealStar.sing()");
  }
}

3. Definieren Sie eine StarHandler-Klasse, um die InvocationHandler-Prozessorschnittstelle zu implementieren. Sie können den Proxy-Zugriff auf echte Rollen über die Invoke-Methode erreichen Rufen Sie die Methode auf, um auf mehrere zuzugreifen. Die Operationen werden einheitlich behandelt.


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class StarHandler implements InvocationHandler{

  private Star realStar;

  public StarHandler(Star realStar) {
    super();
    this.realStar = realStar;
  }

  @Override
  public Object invoke(Object proxy, Method method, Object[] args)
      throws Throwable {
    //返回值
    Object object = null;

    System.out.println("真正的方法执行前!");
    System.out.println("面谈,签合同,预付款,订机票");

    if(method.getName().equals("sing")){
      object = method.invoke(realStar, args);
    }

    System.out.println("真正的方法执行后!");
    System.out.println("收尾款");
    return object;

  }

}

4.客户端测试类


import java.lang.reflect.Proxy;

public class Client {

public static void main(String[] args) {

    Star realStar = new RealStar();
    StarHandler handler = new StarHandler(realStar);

    //通过Proxy生成代理类对象并指定对应的处理器对象
    Star proxyStar = (Star)Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), 
        new Class[]{Star.class}, handler);

    proxyStar.sing();

  }

运行结果如下:

真正的方法执行前!
面谈,签合同,预付款,订机票
RealStar.sing()
真正的方法执行后!
收尾款

开发框架中的应用场景

代理模式在开发框架中的应用场景是非常多的,实际上随便选择一个开发框架都有用到代理模式。例如:

mybatis中实现拦截器插件
AspectJ的实现
spring中AOP的实现

Das obige ist der detaillierte Inhalt vonHinweise zum Agentenmuster von Java Design Patterns. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn