Définition du modèle de décorateur : au lieu d'ajouter ou de modifier des actions d'attributs de classe via des classes dérivées, cet effet est obtenu de manière dynamique grâce à la conception de modèles. Il est plus pratique et flexible que l'héritage et réduit la complexité du programme.
Exemple
Wang Feng construit une équipe de championnat.
Tout d'abord, la catégorie équipe est vide. Après les efforts continus de Wang Feng, il a recruté des étudiants pour l'équipe et a créé une plate-forme appropriée pour que les membres de l'équipe puissent se produire.
L'équipe continue de devenir plus forte et plus complète car les décorateurs ajoutent et modifient la classe de base en fonction des différents besoins, et enfin gagnent votre approbation et répondent à vos besoins.
Diagramme de classes implémentant le pattern assembleur :
Code de formation d'équipe
//汪峰战队 abstract class WangFengTeam { //执行策划命令 abstract public void Acrion(); } //学员 class Student : WangFengTeam { // Methods override public void Acrion() { Console.WriteLine("汪峰团队学员情况:"); } } // 战队总策划 abstract class Direct : WangFengTeam { //汪峰战队 protected WangFengTeam team; // 策划活动 public void SetComponent(WangFengTeam team) { this.team = team; } //执行策划 override public void Acrion() { if (team != null) { team.Acrion(); } } } //男孩唱狂放型的,构建一个组合。 class BoyTeam : Direct { // 组合名称 public string teamName= "锋利的Jquery"; //具体策划 override public void Acrion() { base.Acrion(); Console.WriteLine("我是汪峰团队,狂放型的。"); } } //女孩唱婉约型的,来个模特表演 class GrilTeam : Direct { //具体策划 override public void Acrion() { base.Acrion(); Console.WriteLine("我是汪峰团队,婉约型的。"); //模特表演 show(); } public void show() { Console.WriteLine("婉约型,走秀"); } }
Code client :
public static void Main() { Student team = new Student(); BoyTeam boy = new BoyTeam(); GrilTeam girl = new GrilTeam(); //团队男孩装饰 boy.SetComponent(team); //团队女孩装饰 girl.SetComponent(boy); girl.Acrion(); Console.Read(); }
Avantages et inconvénients du modèle Décorateur
Après avoir lu l'introduction détaillée du modèle Décorateur, continuons à analyser ses avantages et ses inconvénients.
Avantages :
Le but du motif de décoration et de l'héritage est d'étendre la fonctionnalité de l'objet, mais le motif du décorateur est plus flexible que l'héritage
par en utilisant différentes classes de décoration concrètes et les permutations et combinaisons de ces classes, les concepteurs peuvent créer de nombreuses combinaisons de comportements différents
Le modèle de décorateur a une bonne évolutivité
Inconvénients :
Décoration La Le modèle d'opérateur conduira à de nombreux petits objets dans la conception, et s'il est trop utilisé, le programme deviendra plus complexe. Et plus il y a d’objets, plus il est difficile de commettre des erreurs, surtout s’ils se ressemblent tous.
Scénarios d'utilisation
Jetons un coup d'œil aux situations spécifiques dans lesquelles le modèle décorateur est utilisé Le modèle décorateur doit être utilisé dans les situations suivantes :
Vous devez étendre les fonctionnalités d'une classe. ou ajouter quelque chose à un cours Responsabilités supplémentaires.
Vous devez ajouter dynamiquement des fonctions à un objet, et ces fonctions peuvent être révoquées dynamiquement.
Besoin d'ajouter un très grand nombre de fonctions générées par la permutation et la combinaison de certaines fonctions de base
Implémentation du modèle décorateur dans .NET
Il existe également un modèle décorateur dans le Implémentation de la bibliothèque de classes .NET, cette classe est System.IO.Stream Jetons un coup d'œil à la structure de la classe Stream :
BufferedStream, CryptoStream et GZipStream sont en fait deux décorations spécifiques. classes. Le décorateur ici Le modèle omet le rôle de décorateur abstrait (Décorateur). Ce qui suit montre comment le client peut ajouter dynamiquement des fonctions à MemoryStream.
MemoryStream memoryStream = new MemoryStream(new byte[] {95,96,97,98,99}); // 扩展缓冲的功能 BufferedStream buffStream = new BufferedStream(memoryStream); // 添加加密的功能 CryptoStream cryptoStream = new CryptoStream(memoryStream,new AesManaged().CreateEncryptor(),CryptoStreamMode.Write); // 添加压缩功能 GZipStream gzipStream = new GZipStream(memoryStream, CompressionMode.Compress, true);
Résumé
C'est la fin de l'introduction au modèle de décorateur. Le modèle de décorateur utilise la combinaison d'objets au lieu de l'héritage pour obtenir une expansion dynamique au moment de l'exécution. fonctions d'objet et la possibilité d'étendre plusieurs fonctions selon les besoins, évitant ainsi la « mauvaise flexibilité » et les « problèmes de dérivation multi-sous-classes » causés par l'utilisation seule de l'héritage. Dans le même temps, il est tout à fait conforme aux principes de conception orientée objet consistant à « préférer la composition des objets à l'héritage » et au principe « ouvert-fermé ».
Pour plus d'articles analysant le modèle de décorateur dans la programmation de modèles de conception C#, veuillez faire attention au site Web PHP chinois !