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.Diagramme de classes général :
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("可以完成客户请求的需要的功能!"); } }
/** * 目标接口,或称为标准接口 * @author ChuanChen * */ public interface Target { void handleReq(); }
/** * 适配器 (类适配器方式) * (相当于usb和ps/2的转接器) * @author ChuanChen * */ public class Adapter extends Adaptee implements Target { @Override public void handleReq() { super.specificRequest(); } }
/** * 客户端类 * (相当于例子中的笔记本,只有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); } }
/** * 被适配的类 * 已存在的、具有特殊功能、但不符合我们既有的标准接口的类 * (相当于例子中的,PS/2键盘) * @author ChuanChen * */ public class Adaptee { public void specificRequest(){ System.out.println("可以完成客户请求的需要的功能!"); } }
/** * 目标接口,或称为标准接口 * @author ChuanChen * */ public interface Target { void handleReq(); }
/** * 适配器 (对象适配器方式,使用了组合的方式跟被适配对象整合) * (相当于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; } }
/** * 客户端类 * (相当于例子中的笔记本,只有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); } }
Compromis entre l'adaptateur de classe et l'adaptateur d'objet :
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!