Maison >développement back-end >tutoriel php >Modèle de conception PHP : expérience d'apprentissage en mode pont (avec code de cas)
Supposons que vous ayez une classe de forme (Shape), qui étend actuellement deux sous-classes, la classe cercle et la classe carré. Le pseudo-code est le suivant :
interface Shape { function fill (); } class circleShage implements Shape { public function fill () { echo '圆形' . PHP_EOL; } } class SquareShape implements Shape { public function fill () { echo '正方形' . PHP_EOL; } }
Vous souhaitez maintenant ajouter des couleurs à la forme - rouge, bleu. Alors, que devez-vous faire ? Si vous utilisez l'idée d'héritage, alors vous devez écrire quatre classes, comme suit :
class RedCircleShage implements Shape { public function fill () { echo '红色圆形' . PHP_EOL; } } class RedSquareShape implements Shape { public function fill () { echo '红色正方形' . PHP_EOL; } } class BlueCircleShage implements Shape { public function fill () { echo '蓝色圆形' . PHP_EOL; } } class BlueSquareShape implements Shape { public function fill () { echo '蓝色正方形' . PHP_EOL; } }
Mais maintenant, si je veux ajouter une nouvelle forme - un triangle, un nouvelle couleur - Noir ainsi que blanc. Ensuite, nous avons besoin de 12 sous-classes (explosion de classes), alors existe-t-il un bon moyen de le résoudre ?
Synthèse (combinaison) et agrégation
Avant de résoudre les problèmes ci-dessus, nous voulons comprendre le sens de la synthèse et de l’agrégation.
Principe de composition et d'agrégation : essayez d'utiliser la composition/agrégation et essayez de ne pas utiliser l'héritage.
Synthèse (combinaison) : Indique une relation (relation forte) entre un tout et une partie. Ils ont le même cycle de vie, comme par exemple la relation entre une personne et le cœur. partie d'une personne.
Agrégation : Représente une relation entre le tout et les parties (relation faible), indiquant que l'objet A peut contenir l'objet B, mais que l'objet B ne fait pas partie de l'objet A. Par exemple, nous avons parlé de forme et de couleur ci-dessus. La forme peut contenir de la couleur, mais la couleur ne fait pas partie de la forme.
Le mode pont utilise l'agrégation pour découpler le système.
Mode pont
Définition : Séparez la partie abstraite de son implémentation afin qu'elles puissent changer indépendamment
Ci-dessus La définition est difficile à comprendre. En utilisant notre exemple ci-dessus, un système peut avoir plusieurs classifications d'angles (couleur, forme), et chaque classification peut changer (de nouvelles formes et couleurs sont ajoutées), nous pouvons alors utiliser Séparer la mise en œuvre du système de plusieurs perspectives et réduire le couplage entre elles.
Alors comment y parvenir ? Voici le code d'implémentation :
abstract class FShape { protected $color = null; public function __construct(IColor $color) { $this->color = $color; } public function shape () { echo $this->color->color() . $this->setShape() . PHP_EOL; } protected abstract function setShape (); } class CircleShape extends FShape { protected function setShape () { return '圆形'; } } class SquareShape extends FShape { protected function setShape () { return '正方形'; } } interface IColor { public function color (); } class BlueColor implements IColor { public function color () { return '蓝色'; } } class RedColor implements IColor { public function color () { return '红色'; } }
Le code de test est le suivant :
$blueColor = new BlueColor(); $redColor = new RedColor(); $blueCircleShape = new CircleShape($blueColor); $redCircleShape = new CircleShape($redColor); $blueSquareShape = new SquareShape($blueColor); $redSquareShape = new SquareShape($redColor); $blueCircleShape->shape(); $redCircleShape->shape(); $blueSquareShape->shape(); $redSquareShape->shape();
Après avoir utilisé le mode pont, notre code est conforme au "principe d'ouverture et de fermeture". ou la couleur est ajoutée, il suffit d'ajouter de nouvelles classes. Il n'est pas nécessaire de modifier la classe précédente.
Apprentissage recommandé :
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!