Maison Java javaDidacticiel Introduction au mode proxy du modèle de conception Java (mode proxy)

Introduction au mode proxy du modèle de conception Java (mode proxy)

Mar 18, 2017 am 11:55 AM

Comprendre et utiliser les Design Patterns peut cultiver nos bonnes habitudes de programmation orientée objet. En même temps, dans les applications pratiques, nous pouvons être aussi à l'aise qu'un poisson dans l'eau et profiter du plaisir de la facilité.

Le proxy est un mode plus utile, et il existe de nombreuses variantes. Les scénarios d'application couvrent les petites structures jusqu'aux grandes structures de l'ensemble du système. Nous pouvons avoir des concepts tels que les serveurs proxy. L'explication est la suivante : il existe une couche intermédiaire entre le point de départ et la destination, ce qui signifie agence.

Modèle de conception défini : fournissez un proxy pour d'autres objets afin de contrôler l'accès à cet objet.

Pourquoi utiliser le mode proxy

1. Mécanisme d'autorisation Les utilisateurs de différents niveaux ont des droits d'accès différents au même objet. Par exemple, dans le système de forum Jive, le proxy est utilisé pour contrôler le mécanisme d'autorisation. et accéder au forum. Il existe deux types de personnes : les utilisateurs enregistrés et les visiteurs (utilisateurs non enregistrés). Jive utilise des agents comme ForumProxy pour contrôler les droits d'accès de ces deux utilisateurs au forum.
2. Un client ne peut pas exploiter directement un objet, mais il doit interagir avec cet objet.

Deux situations spécifiques sont données à titre d'exemples :

1. Si l'objet est une très grande image et met beaucoup de temps à s'afficher, alors lorsque l'image est incluse dans le document, utilisez un éditeur ou un navigateur pour ouvrir ce document. Le document doit être ouvert très rapidement et vous ne pouvez pas attendre que la grande image soit traitée. Dans ce cas, vous devez créer une image proxy pour remplacer l'image réelle.
2. Si l'objet se trouve sur un serveur distant sur Internet, l'exploitation directe de l'objet peut être lente en raison de la vitesse du réseau, nous pouvons alors utiliser Proxy pour remplacer l'objet en premier.

En bref, le principe est que les objets coûteux ne doivent être créés que lorsqu'ils sont utilisés. Ce principe peut nous faire économiser beaucoup de mémoire Java précieuse. Par conséquent, certaines personnes pensent que Java consomme des ressources et de la mémoire. Je pense que cela a un certain lien avec les idées de programmation.

Comment utiliser le mode proxy

Prenons l'exemple du système de forum Jive. Il existe de nombreux types d'utilisateurs qui accèdent au système de forum : utilisateurs ordinaires enregistrés, gestionnaires de forum, gestionnaires de système et visiteurs. . Seuls les utilisateurs ordinaires enregistrés peuvent parler. Les gestionnaires de forum peuvent gérer les forums pour lesquels ils sont autorisés. Les gestionnaires de système peuvent gérer toutes les affaires, etc. Ces divisions d'autorité et cette gestion sont réalisées à l'aide d'un proxy.

Le Forum est l'interface principale de Jive. Les principaux comportements liés aux opérations du forum sont affichés dans le Forum, tels que le nom du forum, l'obtention et la modification de la description du forum, la publication, la suppression et la modification des messages, etc.

Les utilisateurs avec différents niveaux d'autorisations sont définis dans ForumPermissions :

public class ForumPermissions implements Cacheable {
/**
* Permission to read object.
*/
public static final int READ = 0;
/**
* Permission to administer the entire sytem.
*/
public static final int SYSTEM_ADMIN = 1;
/**
* Permission to administer a particular forum.
*/
public static final int FORUM_ADMIN = 2;
/**
* Permission to administer a particular user.
*/
public static final int USER_ADMIN = 3;
/**
* Permission to administer a particular group.
*/
public static final int GROUP_ADMIN = 4;
/**
* Permission to moderate threads.
*/
public static final int MODERATE_THREADS = 5;
/**
* Permission to create a new thread.
*/
public static final int CREATE_THREAD = 6;
/**
* Permission to create a new message.
*/
public static final int CREATE_MESSAGE = 7;
/**
* Permission to moderate messages.
*/
public static final int MODERATE_MESSAGES = 8;
.....
public boolean isSystemOrForumAdmin() {
 return (values[FORUM_ADMIN] || values[SYSTEM_ADMIN]);
}
.....
}
Copier après la connexion

Par conséquent, les différentes autorisations d'opération dans Forum sont liées aux niveaux d'utilisateurs définis par ForumPermissions, comme l'interface Implémentation du Forum : ForumProxy relie cette correspondance. Par exemple, pour modifier le nom du Forum, seul l'administrateur du forum ou l'administrateur système peut le modifier. Le code est le suivant :

public class ForumProxy implements Forum {
    private ForumPermissions permissions;
    private Forum forum;
    this.authorization = authorization;
    public ForumProxy(Forum forum, Authorization authorization,
    ForumPermissions permissions){
        this.forum = forum;
        this.authorization = authorization;
        this.permissions = permissions;
    }
    .....
    public void setName(String name) throws UnauthorizedException,
        ForumAlreadyExistsException{
  //只有是系统或论坛管理者才可以修改名称
  if (permissions.isSystemOrForumAdmin()) {
   forum.setName(name);
  }
  else {
   throw new UnauthorizedException();
  }
    }
    ...
}
Copier après la connexion

Et DbForum est la véritable implémentation de l'interface Forum. le nom du forum à titre d'exemple :

public class DbForum implements Forum, Cacheable {
    ...
    public void setName(String name) throws ForumAlreadyExistsException {
  ....
  this.name = name;
  //这里真正将新名称保存到数据库中
  saveToDb();
  ....
    }
    ...
}
Copier après la connexion

Quand il s'agit de changer le nom du forum, les autres programmes doivent d'abord s'occuper de ForumProxy. ForumProxy décide s'il a le pouvoir de faire une certaine chose. une véritable « passerelle » et « système proxy de sécurité ».

Dans les applications quotidiennes, il est inévitable que l'autorisation du système ou le système de sécurité soit toujours impliqué. Que vous utilisiez Proxy consciemment ou non, vous utilisez déjà Proxy.

Continuons à parler en profondeur avec Jive. Ce qui suit concernera le mode usine.

Nous savons déjà que l'utilisation de Forum nécessite ForumProxy. La création d'un forum dans Jive utilise le mode Factory. Il existe une classe abstraite générale ForumFactory. Dans cette classe abstraite, l'appel de ForumFactory est implémenté via la méthode getInstance() Singleton. utilisé ici (également l'un des modèles de conception), et getInstance() renvoie ForumFactoryProxy.

Pourquoi ne pas renvoyer ForumFactory, mais renvoyer l'implémentation de ForumFactory, ForumFactoryProxy ? La raison est évidente. Vous devez utiliser un proxy pour déterminer si vous êtes autorisé à créer un forum.

Dans ForumFactoryProxy, nous voyons le code suivant :

public class ForumFactoryProxy extends ForumFactory {
 protected ForumFactory factory;
 protected Authorization authorization;
 protected ForumPermissions permissions;
 public ForumFactoryProxy(Authorization authorization, ForumFactory factory,ForumPermissions permissions){
  this.factory = factory;
  this.authorization = authorization;
  this.permissions = permissions;
 }
 public Forum createForum(String name, String description)
  throws UnauthorizedException, ForumAlreadyExistsException{
  //只有系统管理者才可以创建forum
  if (permissions.get(ForumPermissions.SYSTEM_ADMIN)) {
   Forum newForum = factory.createForum(name, description);
   return new ForumProxy(newForum, authorization, permissions);
  }
  else {
   throw new UnauthorizedException();
  }
    }
}
Copier après la connexion

La méthode createForum renvoie également ForumProxy, comme un mur. Les autres programmes ne peuvent interagir qu'avec Proxy.

Remarquez qu'il y a deux proxys ici : ForumProxy et ForumFactoryProxy. Représente deux responsabilités différentes : utiliser le Forum et créer le Forum. Quant à savoir pourquoi l'utilisation d'objets et la création d'objets sont séparées, c'est aussi la raison pour laquelle le modèle Factory est utilisé : pour « encapsuler » et « répartir ». En d’autres termes, les fonctions doivent être aussi simples que possible pour faciliter la maintenance et la modification.

La création et l'utilisation d'autres messages dans le système de forum Jive sont toutes basées sur l'idée du Forum.

Ci-dessus, nous avons expliqué comment utiliser le proxy pour accéder au mécanisme d'autorisation. Le proxy peut également masquer aux utilisateurs une autre méthode d'optimisation appelée copie sur écriture. La copie d'un objet volumineux et complexe est une opération coûteuse si l'objet d'origine n'est pas modifié pendant le processus de copie, une telle surcharge de copie est alors inutile. Utilisez un proxy pour retarder ce processus de copie.

比如:我们有一个很大的Collection,具体如hashtable,有很多客户端会并发同时访问它。其中一个特别的客户端要进行连续的数据获取,此时要求其他客户端不能再向hashtable中增加或删除 东东。

最直接的解决方案是:使用collection的lock,让这特别的客户端获得这个lock,进行连续的数据获取,然后再释放lock。

public void foFetches(Hashtable ht){
 synchronized(ht){
  //具体的连续数据获取动作..
 }
}
Copier après la connexion


但是这一办法可能锁住Collection会很长时间,这段时间,其他客户端就不能访问该Collection了。

第二个解决方案是clone这个Collection,然后让连续的数据获取针对clone出来的那个Collection操作。这个方案前提是,这个Collection是可clone的,而且必须有提供深度clone的方法。Hashtable就提供了对自己的clone方法,但不是Key和value对象的clone。

public void foFetches(Hashtable ht){
 Hashttable newht=(Hashtable)ht.clone();
}
Copier après la connexion

问题又来了,由于是针对clone出来的对象操作,如果原来的母体被其他客户端操作修改了,那么对clone出来的对象操作就没有意义了。

最后解决方案:我们可以等其他客户端修改完成后再进行clone,也就是说,这个特别的客户端先通过调用一个叫clone的方法来进行一系列数据获取操作。但实际上没有真正的进行对象拷贝,直至有其他客户端修改了这个对象Collection。

使用Proxy实现这个方案,这就是copy-on-write操作。

Proxy应用范围很广,现在流行的分布计算方式RMI和Corba等都是Proxy模式的应用。

更多Java设计模式之代理模式(Proxy模式)介绍相关文章请关注PHP中文网!

相关文章:

Java实现中介者(Mediator)模式的代码具体介绍

java设计模式之中介者模式

Java设计模式之责任链模式简介

Déclaration de ce site Web
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Top 4 frameworks JavaScript en 2025: React, Angular, Vue, Svelte Top 4 frameworks JavaScript en 2025: React, Angular, Vue, Svelte Mar 07, 2025 pm 06:09 PM

Cet article analyse les quatre premiers cadres JavaScript (React, Angular, Vue, Svelte) en 2025, en comparant leurs performances, leur évolutivité et leurs perspectives d'avenir. Alors que tous restent dominants en raison de fortes communautés et écosystèmes, leur populaire relatif

Comment implémenter la mise en cache à plusieurs niveaux dans les applications Java à l'aide de bibliothèques comme la caféine ou le cache de goyave? Comment implémenter la mise en cache à plusieurs niveaux dans les applications Java à l'aide de bibliothèques comme la caféine ou le cache de goyave? Mar 17, 2025 pm 05:44 PM

L'article examine la mise en œuvre de la mise en cache à plusieurs niveaux en Java à l'aide de la caféine et du cache de goyave pour améliorer les performances de l'application. Il couvre les avantages de configuration, d'intégration et de performance, ainsi que la gestion de la politique de configuration et d'expulsion le meilleur PRA

Node.js 20: Boosts de performances clés et nouvelles fonctionnalités Node.js 20: Boosts de performances clés et nouvelles fonctionnalités Mar 07, 2025 pm 06:12 PM

Node.js 20 améliore considérablement les performances via des améliorations du moteur V8, notamment la collecte des ordures et les E / S plus rapides. Les nouvelles fonctionnalités incluent une meilleure prise en charge de Webassembly et des outils de débogage raffinés, augmentant la productivité des développeurs et la vitesse d'application.

Comment fonctionne le mécanisme de chargement de classe de Java, y compris différents chargeurs de classe et leurs modèles de délégation? Comment fonctionne le mécanisme de chargement de classe de Java, y compris différents chargeurs de classe et leurs modèles de délégation? Mar 17, 2025 pm 05:35 PM

Le chargement de classe de Java implique le chargement, la liaison et l'initialisation des classes à l'aide d'un système hiérarchique avec Bootstrap, Extension et Application Classloaders. Le modèle de délégation parent garantit que les classes de base sont chargées en premier, affectant la classe de classe personnalisée LOA

Spring Boot SnakeyAml 2.0 CVE-2022-1471 Issue fixe Spring Boot SnakeyAml 2.0 CVE-2022-1471 Issue fixe Mar 07, 2025 pm 05:52 PM

Cet article aborde la vulnérabilité CVE-2022-1471 dans SnakeyAml, un défaut critique permettant l'exécution du code distant. Il détaille comment la mise à niveau des applications de démarrage de printemps vers SnakeyAml 1.33 ou ultérieurement atténue ce risque, en soulignant cette mise à jour de dépendance

Iceberg: L'avenir des tables de Data Lake Iceberg: L'avenir des tables de Data Lake Mar 07, 2025 pm 06:31 PM

Iceberg, un format de table ouverte pour les grands ensembles de données analytiques, améliore les performances et l'évolutivité du lac Data. Il aborde les limites du parquet / orc par le biais de la gestion interne des métadonnées, permettant une évolution efficace du schéma, un voyage dans le temps, un W simultanément

Comment puis-je implémenter des techniques de programmation fonctionnelle en Java? Comment puis-je implémenter des techniques de programmation fonctionnelle en Java? Mar 11, 2025 pm 05:51 PM

Cet article explore l'intégration de la programmation fonctionnelle dans Java à l'aide d'expressions Lambda, de flux API, de références de méthode et facultatif. Il met en évidence des avantages tels que l'amélioration de la lisibilité au code et de la maintenabilité grâce à la concision et à l'immuabilité

Comment utiliser Maven ou Gradle pour la gestion avancée de projet Java, la création d'automatisation et la résolution de dépendance? Comment utiliser Maven ou Gradle pour la gestion avancée de projet Java, la création d'automatisation et la résolution de dépendance? Mar 17, 2025 pm 05:46 PM

L'article discute de l'utilisation de Maven et Gradle pour la gestion de projet Java, la construction de l'automatisation et la résolution de dépendance, en comparant leurs approches et leurs stratégies d'optimisation.

See all articles