Maison  >  Article  >  Java  >  Illustration du modèle d'adaptateur dans les modèles de conception Java

Illustration du modèle d'adaptateur dans les modèles de conception Java

黄舟
黄舟original
2017-10-18 09:36:481378parcourir

Cet article présente principalement en détail les notes du modèle d'adaptateur du modèle de conception Java, qui ont une certaine valeur de référence. Les amis intéressés peuvent se référer au

Modèle d'adaptateur :

Le modèle d'adaptateur transforme l'interface d'une classe en une autre interface attendue par le client, permettant ainsi à deux classes qui étaient initialement incapables de travailler ensemble en raison d'interfaces incompatibles de travailler ensemble.

Scènes de la vie :

1. Adaptateur secteur pour ordinateur portable, qui peut convertir 220 V en une tension adaptée à une utilisation sur ordinateur portable.

2. Insérez le clavier de l'interface PS/2 du bureau dans l'interface USB de l'ordinateur portable. Vous avez besoin d'un adaptateur d'interface USB et PS/2. agit comme un adaptateur.

Illustration du modèle dadaptateur dans les modèles de conception Java

Diagramme de classes général :

Illustration du modèle dadaptateur dans les modèles de conception Java

Dans le diagramme de classes général ci-dessus, la classe Cient Ce à quoi nous nous retrouvons confrontés est l'interface Target (ou classe abstraite), qui ne peut utiliser que des sous-classes qui répondent à cette norme cible ; et la classe Adaptee est l'objet adapté (également appelé rôle source) car il contient des opérations, des fonctions, des fonctions spécifiques ; etc., nous voulons donc l'utiliser dans notre propre système et le convertir en une classe qui répond à nos normes, afin que la classe Client puisse choisir d'utiliser la classe ConcreteTarget ou la classe Adaptee avec des fonctions spéciales de manière transparente.

Rôle dans le modèle d'adaptateur :

Interface cible (Target) : l'interface attendue par les clients. La cible peut être une classe concrète ou abstraite, ou une interface.

Classe à adapter (Adaptee) : classe d'interface ou d'adaptation à adapter.
Adaptateur : la classe adaptateur est le cœur de ce modèle. L'adaptateur convertit l'interface source en interface cible en encapsulant un objet qui doit être adapté. Bien évidemment, ce rôle ne peut pas être une interface, mais doit être une classe concrète.

La structure du modèle d'adaptateur :

Le modèle d'adaptateur a deux formes différentes : le modèle d'adaptateur de classe et le modèle d'adaptateur d'objet.

Le modèle d'adaptateur d'une classe convertit l'API de la classe adaptatrice en API de la classe cible.

Le modèle d'adaptateur d'objet est le même que le modèle d'adaptateur d'objet. Le modèle d'adaptateur d'objet convertit l'API de la classe adaptée en API de la classe cible, le modèle d'adaptateur d'objet ne l'est pas. Utilisez une relation d'héritage pour vous connecter à la classe Adaptee, mais utilisez une relation de délégation pour vous connecter à la classe Adaptee.

Modèle d'adaptateur de classe

1. Créez une classe adaptée :


/**
 * 被适配的类
 * 已存在的、具有特殊功能、但不符合我们既有的标准接口的类
 * (相当于例子中的,PS/2键盘)
 * @author ChuanChen
 * 
 */
public class Adaptee {

  public void specificRequest(){
    System.out.println("可以完成客户请求的需要的功能!");
  }
}
2. Créez une classe adaptée. interface cible qui peut gérer certaines requêtes spéciales


/**
 * 目标接口,或称为标准接口
 * @author ChuanChen
 *
 */
public interface Target {
  void handleReq();
}
3. Créer un adaptateur (méthode d'adaptateur de classe)


/**
 * 适配器 (类适配器方式)
 * (相当于usb和ps/2的转接器)
 * @author ChuanChen
 *
 */
public class Adapter extends Adaptee implements Target {


  @Override
  public void handleReq() {
    super.specificRequest();
  }
}
4. Créer un client


/**
 * 客户端类
 * (相当于例子中的笔记本,只有USB接口)
 * @author ChuanChen
 *
 */
public class Client {

  public void test(Target t){
    t.handleReq();
  }

  public static void main(String[] args) {
    Client c = new Client();
    Adaptee a = new Adaptee();
    Target t = new Adapter();
    c.test(t); 
  }  
}
L'adaptateur implémenté ci-dessus est appelé un adaptateur de classe, car la classe Adapter hérite d'Adaptee (classe adaptée), et également implémente l'interface Target (car Java ne prend pas en charge l'héritage multiple, il est donc implémenté de cette manière). Dans la classe Client, nous pouvons choisir et créer n'importe quelle sous-classe qui répond aux besoins pour implémenter des fonctions spécifiques.

Modèle d'adaptateur d'objets

1. Créer une classe adaptée :


/**
 * 被适配的类
 * 已存在的、具有特殊功能、但不符合我们既有的标准接口的类
 * (相当于例子中的,PS/2键盘)
 * @author ChuanChen
 * 
 */
public class Adaptee {

  public void specificRequest(){
    System.out.println("可以完成客户请求的需要的功能!");
  }
}
2. Créer une interface cible, peut gérer quelques demandes spéciales


/**
 * 目标接口,或称为标准接口
 * @author ChuanChen
 *
 */
public interface Target {
  void handleReq();
}
3. Créer un adaptateur (méthode d'adaptateur d'objet, en utilisant une méthode de combinaison pour intégrer l'objet adapté)


/**
 * 适配器 (对象适配器方式,使用了组合的方式跟被适配对象整合)
 * (相当于usb和ps/2的转接器)
 * @author ChuanChen
 *
 */

public class Adapter implements Target{

private Adaptee adaptee;

  @Override
  public void handleReq() {
    adaptee.specificRequest();
  }

  public Adapter(Adaptee adaptee) {
    super();
    this.adaptee = adaptee;
  }

}
4. Créer un client


/**
 * 客户端类
 * (相当于例子中的笔记本,只有USB接口)
 * @author ChuanChen
 *
 */
public class Client {

  public void test(Target t){
    t.handleReq();
  }

  public static void main(String[] args) {
    Client c = new Client();
    Adaptee a = new Adaptee();
    Target t = new Adapter(a);
    c.test(t);
  }  
}
Il suffit de modifier la structure interne de la classe Adapter, c'est-à-dire Adapter Il doit d'abord posséder un objet de la classe adaptée, puis déléguer des fonctions spéciales spécifiques à cet objet à implémenter. En utilisant le mode adaptateur d'objet, la classe Adapter (classe d'adaptation) peut s'adapter à plusieurs classes adaptées différentes en fonction de l'objet Adaptee entrant. Bien sûr, à ce stade, nous pouvons extraire une interface pour plusieurs classes adaptées ou classes abstraites. Il semble que le modèle d'adaptateur d'objet soit plus flexible.

Compromis entre l'adaptateur de classe et l'adaptateur d'objet :

  • L'adaptateur de classe utilise l'héritage d'objet, qui est une méthode de définition statique tandis que l'adaptateur d'objet ; utilise La façon dont les objets sont combinés est une combinaison dynamique.

  • Pour les adaptateurs de classe, puisque l'adaptateur hérite directement d'Adaptee, l'adaptateur ne peut pas fonctionner avec les sous-classes d'Adaptee, car l'héritage est une relation statique. Lorsque l'adaptateur hérite d'Adaptee, ce ne sera peut-être pas le cas. Je traiterai à nouveau des sous-classes d'Adaptee.

  • Pour les adaptateurs d'objets, un adaptateur peut adapter plusieurs sources différentes à la même cible. En d’autres termes, le même adaptateur peut adapter à la fois la classe source et ses sous-classes à l’interface cible. Étant donné que l'adaptateur d'objet utilise la relation de combinaison d'objets, tant que le type d'objet est correct, peu importe qu'il s'agisse d'une sous-classe ou non.

  • Pour les adaptateurs de classe, l'adaptateur peut redéfinir une partie du comportement d'Adaptee, ce qui équivaut à la sous-classe remplaçant certaines méthodes d'implémentation de la classe parent.

  • Pour les adaptateurs d'objets, il est difficile de redéfinir le comportement d'Adaptee. Dans ce cas, vous devez définir une sous-classe d'Adaptee pour implémenter la redéfinition, puis laisser l'adaptateur combiner les. sous-classes. Bien qu'il soit difficile de redéfinir le comportement d'Adaptee, il est très pratique d'ajouter de nouveaux comportements, et les comportements nouvellement ajoutés peuvent être appliqués à toutes les sources en même temps.

  • Pour les adaptateurs de classe, un seul objet est introduit, et aucune référence supplémentaire n'est nécessaire pour obtenir indirectement l'Adaptee.

  • Pour les adaptateurs d'objets, des références supplémentaires sont nécessaires pour obtenir indirectement l'Adaptee.

Il est recommandé d'utiliser autant que possible l'implémentation de l'adaptateur d'objet, en utilisant plus de composition/agrégation et moins d'héritage. Bien entendu, les problèmes spécifiques doivent être analysés en détail et la méthode de mise en œuvre doit être sélectionnée en fonction des besoins.

Avantages du patron d'adaptateur :

Meilleure réutilisabilité :

Le système doit utiliser des classes existantes et l'interface de cette classe ne répond pas aux besoins du système. Ensuite, ces fonctions peuvent être mieux réutilisées via le mode adaptateur.

Meilleure évolutivité :

Lors de la mise en œuvre de la fonction d'adaptateur, vous pouvez appeler les fonctions que vous avez développées, cela s'étend naturellement la fonctionnalité du système.
Inconvénients du mode adaptateur

Une utilisation excessive d'adaptateurs rendra le système très compliqué et difficile à comprendre dans son ensemble. Par exemple, il est évident que l'interface A est appelée, mais en fait elle est adaptée en interne pour implémenter l'interface B. Si cela se produit trop souvent dans un système, cela équivaudra à un désastre. Par conséquent, si cela n’est pas nécessaire, vous pouvez reconstruire le système directement sans utiliser l’adaptateur.

Scénarios de mode adaptateur au travail :

1. L'interface de la classe existante ne répond pas à nos besoins
2. Créer une classe réutilisable donc ; que la classe peut fonctionner avec d'autres classes non liées ou imprévues (c'est-à-dire des classes dont les interfaces ne sont pas nécessairement compatibles)
3. Sans sous-classer chacune pour correspondre à leur Dans le cas des interfaces, utilisez une sous-classe existante.

Le mode adaptateur est souvent utilisé pour la mise à niveau et la mise à niveau d'anciens systèmes. Si notre système n’a jamais besoin de maintenance après le développement, alors de nombreux modèles sont inutiles. Mais malheureusement, en réalité, le coût de maintenance d’un système est souvent plusieurs fois supérieur à celui de son développement.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn