1. Mode d'emploi
(1) Le modèle de décorateur peut apporter des fonctions d'extension plus flexibles que l'héritage. En utilisant plus de méthodes, vous pouvez obtenir des résultats divers avec différents états comportementaux en combinant différents objets de décorateur. Le modèle du décorateur est plus évolutif que l'héritage et suit parfaitement le principe d'ouverture et de fermeture. L'héritage est une responsabilité supplémentaire statique, tandis que le décorateur est une responsabilité supplémentaire dynamique.
(2) La classe décoration et la classe décorée peuvent se développer indépendamment et ne seront pas couplées l'une à l'autre. Le mode décoration est un mode alternatif à l'héritage. Le mode décoration peut étendre dynamiquement les fonctions d'une classe d'implémentation.
2. Exemple
public class HelloWorld { public static void main(String[] args) { //点一份炒饭 FastFood food = new FriedRice(); //花费的价格 System.out.println(food.getDesc() + " " + food.cost() + "元"); System.out.println("========"); //点一份加鸡蛋的炒饭 FastFood food1 = new FriedRice(); food1 = new Egg(food1); //花费的价格 System.out.println(food1.getDesc() + " " + food1.cost() + "元"); System.out.println("========"); //点一份加培根的炒面 FastFood food2 = new FriedNoodles(); food2 = new Bacon(food2); //花费的价格 System.out.println(food2.getDesc() + " " + food2.cost() + "元"); } } // 快餐抽象类 abstract class FastFood { private float price; private String desc; public FastFood() {} public FastFood(float price, String desc) { this.price = price; this.desc = desc; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } // 获取价格 public abstract float cost(); } // 炒饭 class FriedRice extends FastFood { public FriedRice() { super(10, "炒饭"); } @Override public float cost() { return getPrice(); } } // 炒面 class FriedNoodles extends FastFood { public FriedNoodles() { super(12, "炒面"); } @Override public float cost() { return getPrice(); } } // 配料 abstract class Garnish extends FastFood { private FastFood fastFood; public FastFood getFastFood() { return fastFood; } public void setFastFood(FastFood fastFood) { this.fastFood = fastFood; } public Garnish(FastFood fastFood, float price, String desc) { super(price, desc); this.fastFood = fastFood; } } // 鸡蛋配料 class Egg extends Garnish { public Egg(FastFood fastFood) { super(fastFood, 1, "鸡蛋"); } @Override public float cost() { return getPrice() + getFastFood().getPrice(); } @Override public String getDesc() { return super.getDesc() + getFastFood().getDesc(); } } //培根配料 class Bacon extends Garnish { public Bacon(FastFood fastFood) { super(fastFood,2,"培根"); } @Override public float cost() { return getPrice() + getFastFood().getPrice(); } @Override public String getDesc() { return super.getDesc() + getFastFood().getDesc(); } }
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!