Maison  >  Article  >  Java  >  Introduction détaillée du modèle de décorateur Java

Introduction détaillée du modèle de décorateur Java

巴扎黑
巴扎黑original
2017-09-06 09:49:251262parcourir

Cet article présente principalement le modèle de décorateur Java et analyse en détail les principes du modèle de décorateur et les techniques d'implémentation spécifiques à Java sous forme d'exemples. Les amis dans le besoin peuvent s'y référer

Cet article décrit le modèle de décorateur. Décorateur Java avec exemples. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

Mode de décoration

Dynamique sans modifier le fichier de classe d'origine et en utilisant l'héritage pour étendre les fonctionnalités d'un objet. Il enveloppe l'objet réel en créant un objet d'emballage, c'est-à-dire une décoration.

L'objet de décoration accepte toutes les demandes du client. Il transmet ces requêtes aux objets réels. Les objets décorés peuvent ajouter des fonctionnalités supplémentaires avant ou après le transfert de ces demandes.

Cela garantit que des fonctionnalités supplémentaires peuvent être ajoutées en externe lors de l'exécution sans modifier la structure d'un objet donné. Dans la conception orientée objet, l'extension fonctionnelle d'une classe donnée est généralement implémentée via l'héritage.

Avantages

1. Le mode Décorateur et l'héritage sont tous deux conçus pour étendre les fonctionnalités des objets, mais Décorateur peut offrir de meilleures performances que l'héritage. Plus de flexibilité.

2. En utilisant différentes classes de décoration spécifiques ainsi que la disposition et la combinaison de ces classes de décoration, les concepteurs peuvent créer de nombreuses combinaisons de comportements différents.

Rôle

Les différents rôles en mode décoration sont :

(1) Rôle du composant abstrait (Component) : Donner une interface abstraite, Préparer les objets avec des spécifications pour recevoir des responsabilités supplémentaires.
(2) Rôle du composant concret : définir une classe qui recevra des responsabilités supplémentaires.
(3) Rôle de décorateur : contient une instance d'un objet Component et implémente une interface cohérente avec l'interface du composant abstrait.
(4) Rôle de décorateur de béton : responsable de l'ajout de responsabilités supplémentaires aux objets composants.

Exemple de code

Prenons comme exemple un gâteau à la main. Les gâteaux à la main peuvent avoir de nombreuses saveurs, mais la plus basique est un gâteau à la main original sur cette base. , on peut ajouter une ou plusieurs combinaisons comme des œufs, du bœuf, du filet, etc.

Rôle de composant abstrait

package 装饰者模式;
/**
 * 抽象类接口,规范饼的属性
 * @author oooo
 *
 */
public interface Cake {
//两个属性
  public String descripestion();
//属性描述
  public Double money();
//价格描述
}

Rôle de composant en béton

package 装饰者模式;
/**
 * 原味手抓饼类
 * @author oooo
 *负责接收附加属性的类
 */
public class shreddedcake implements Cake{
//实现Cake接口
  @Override
  public String descripestion() {
    //描述属性
    return "原味手抓饼";
  }
  @Override
  public Double money() {
     //描述价格
    return 3.5;
  }
}

Rôle de décorateur

package 装饰者模式;
/**
 * 建立和饼的连接,得到原始饼的属性,添加属性的中介。
 * @author oooo
 *
 */
public abstract class Deractor implements Cake{
  Cake cake;
  public Deractor(Cake cake) {
    this.cake=cake;
  }
  public String descripestion(){
    return cake.descripestion();
  }
  public Double money(){
    return cake.money();
  }
}

Rôle de décorateur en béton

package 装饰者模式;
/**
 * 鸡蛋手抓饼类
 * @author oooo
 *添加鸡蛋属性
 */
public class EggshrededCake extends Deractor{
  public EggshrededCake(Cake cake) {
    super(cake);
  }
  public String descripestion() {
    return "鸡蛋"+cake.descripestion();
  }
  @Override
  public Double money() {
    return 3.5+1.5;
  }
}

Rôle de décorateur en béton

package 装饰者模式;
/**
 * 牛肉味手抓饼
 * @author oooo
 *添加牛肉属性
 */
public class beffshredded extends Deractor{
  public beffshredded(Cake cake) {
    super(cake);
    // TODO Auto-generated constructor stub
  }
  public String descripestion() {
    return "牛肉"+cake.descripestion();
  }
  @Override
  public Double money() {
    return cake.money()+3.0;
  }
}

Classe de test

package 装饰者模式;
public class Test {
  /**
   * 测试类
   * @param args
   */
  public static void main(String[] args) {
    //新建一个原味手抓饼类
    shreddedcake sh=new shreddedcake();
    System.out.println(sh.descripestion());
    System.out.print("  价格: "+sh.money());
    //新建一个鸡蛋类,附加鸡蛋属性到手抓饼上
    EggshrededCake egg=new EggshrededCake(sh);
    System.out.println(egg.descripestion());
    System.out.print("  价格:"+egg.money());
    //新建一个牛肉类,附加牛肉属性到手抓饼上
    beffshredded beff=new beffshredded(egg);
    System.out.println(beff.descripestion());
    System.out.print("  价格:"+beff.money());
  }
}

Résultat de sortie :

原味手抓饼  价格: 3.5
鸡蛋原味手抓饼  价格:5.0
牛肉鸡蛋原味手抓饼  价格:8.0

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!

Déclaration:
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