prototype
Mode Prototype: Lorsque vous créez un processus classe donnée est très coûteux ou très complexe, sur l'utilisation du modèle prototype.
Nous jouons le jeu quand le jeu va créer dynamiquement étrange, mais quand d'étranges varie en fonction de différents scénarios créés par le héros lui-même va créer quelques disciples. Créer une grande variété d'instance de monstres, est devenu de plus en plus difficile, va mettre les détails des différents états, puis le constructeur, il ne semblait pas cohérent. Si vous pouvez encapsuler tous les détails des cas dans une seule zone, il est possible de créer un code qui gère les détails des monstres, découplées à partir du code réellement besoin de créer dynamiquement une instance, le programme deviendra assez propre.
Prototype modèle pour créer une nouvelle instance en copiant une instance existante, la méthode clone est généralement utilisé, ou désérialisation.
Conception diagramme de classes:
modèle prototype a trois rôles:
rôles Prototype : la duplication d' une méthode de définition d'instance existante génère une nouvelle instance (Monster).
Prototype des rôles spécifiques : mise en œuvre (WellKnowMonster, DynamicGeneratedMonster) pour générer une nouvelle instance de la copie d' une instance existante.
Rôles utilisateur : le maintien d' un registre, et de fournir une méthode pour trouver l'instance correcte du prototype. Enfin, il est prévu un procédé d'obtention nouvelle instance, la méthode utilisée pour déléguer de nouvelles instances de l'instance répliquée.
Code de mise en œuvre:
① rôle prototype
1 publique Interface Monstre 2 { 3 publique Clone Monster (); 4 }
② prototype de rôle spécifique
1 publique classe WellKnowMonster: Monster 2 { 3 publique Clone Monster () 4 { 5 clone Monster = JsonConvert.DeserializeObject <WellKnowMonster> (JsonConvert.SerializeObject ( ce )); 6 retour clone; 7 } 8 } 9 10 11 publique classe DynamicGeneratedMonster: Monster 12 { 13 publique Clone Monster () 14 { 15 Clone Monster = JsonConvert.DeserializeObject <DynamicGeneratedMonster> (JsonConvert.SerializeObject ( ce )); 16 retour clone; 17 } 18 }
③ rôles utilisateur
1 publique classe MonsterRegistry 2 { 3 Dictionnaire < string , Monster> monsterDic = nouveau Dictionnaire < string , Monster> (); 4 publique vide RegisterMonster ( chaîne clé, monstre de monstre) { 5 monsterDic.Add (clé, monstre); 6 } 7 publique Monstre GetMonster ( string key) { 8 Monstre = monsterDic [key]; 9 retour monster.Clone (); dix } 11 }
④ essai
avantages:
1, masquer la complexité de la création de nouvelles instances du client.
2, fournir le client peut produire des objets de l'option de type inconnu.
3, dans certaines circonstances, copie l'objet est plus efficace que de créer un nouvel objet.
Inconvénients: utilisations et
1, dans une hiérarchie de classes complexe, lorsque le système doit créer un nouvel objet de nombreux types, considérons le prototype.
2, l'inconvénient d'utiliser le modèle prototype, la copie d'objets parfois très complexes.
visiteurs
mode Visiteurs: Lorsque vous voulez ajouter de nouvelles fonctionnalités comme une combinaison d'un objet, et le paquet est pas important, il est l'utilisation des visiteurs.
A l'intérieur du restaurant au client, le client peut demander le menu d'information (comme le poivron rouge, le goût est pas lourd comme), et même certains demandera composition des matières premières.
Nous aimons cette conception pour ajouter une nouvelle méthode dans chaque lieu, si l'ajout d'une nouvelle méthode, nous devons ajouter une nouvelle méthode en deux endroits, dans le cas où plus d'un nouveau menu, nous devons modifier trois places. Dans ce cas, nous pouvons utiliser le modèle des visiteurs. Chaque élément dans les combinaisons de visiteurs, l'état de tous les objets de la collection. Une fois que l'état est collectée, les clients peuvent permettre aux visiteurs de l'état des différentes opérations. Lorsque vous avez besoin de nouvelles fonctionnalités, tant que le renforcement du visiteur peut être.
Code de mise en œuvre:
① obtenir les menus, les éléments de menu de méthode de définition d'interface GetState
. 1 publique Interface de MenuComponent 2 { 3. Publics vide GetState (touché des visiteurs); 4. } 5. 6. 7. // Menu 8. Publique classe Menu: de MenuComponent 9. { 10 publique Chaîne displayInfo = " pas chaud, le goût modéré " , 11. Publique vide GetState (visiteur TIH) 12 est { 13 est visitor.Visit ( la présente ); 14 } 15 } 16 17 // 原料 18 publics classe Ingrédients: MenuComponent 19 { 20 publique chaîne displayInfo = " 不辣,偏咸" ; 21 publique vide GetState (visiteur visiteur) 22 { 23 visitor.Visit ( ce ); 24 } 25 }
② visiteurs, les visiteurs de définir l'interface à l'aide du menu Type d'interface
publique Interface visiteur { publique vide visite (menu du menu); du public vide Visiter (ingrédients Ingrédients); } Classe MenuVisitor: Visiteur { publique vide visite (menu Menu) { Console.WriteLine (menu.displayInfo); } Publics vide visite (ingrédients Ingrédients) { Console.WriteLine (ingredients.displayInfo); } }
③ essai
avantages:
1, vous permet de rejoindre une nouvelle structure d'exploitation pour la combinaison, sans changer la structure elle-même.
2, veulent se joindre à la nouvelle opération est relativement facile.
3, l'opération effectuée par le visiteur, qui est le code ensemble.
Inconvénients: utilisations et
1, lors de l'utilisation du motif de visiteur, le paquet brisera combinaison de classe.
2, car l'ajout des modèles d'accès que nécessaire pour chaque visite, afin de modifier la structure du portefeuille plus difficile.