装饰者模式简介:
装饰者模式: 动态的将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的代替方案。(因为装饰者模式使用的是组合的方式提供了扩展而不是使用继承从而可以保证 在任何适合都可以 进行扩展。)
装饰者模式的类图:
装饰者模式的一些特征:
1. 装饰者和被装饰者有着共同的超类
2.我们可以使用多个装饰者去装饰同一个对象
例子:
我们去饭店吃饭,有 食物米饭 ,菜 有鸡肉、鸭肉、猪肉、青菜 等等,我们可以可以选择 食物和菜的任意组合
抽象构件角色(food): 给出一个接口,以规范准备接收附加责任的对象
具体构件角色(rice): 定义一个将要接收附加责任的类
装饰角色(foodDecorator):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口
具体装饰角色(Duck、Chicken):负责给构件对象“贴上”附加的责任
food :给出一个接口,规范了使用的接口信息
具体构件角色(rice): 定义一个将要接收附加责任的类
装饰角色(foodDecorator):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口
具体装饰角色(Duck、Chicken):负责给构件对象“贴上”附加的责任
public interface Food { public void eat(); }
rice :具体构建角色,给出了需要附加 其他行为的类
public class Rice implements Food { @Override public void eat() { System.out.println("吃米饭"); } }
public abstract class FoodDecorator implements Food {
public abstract void eat(); }
具体装饰角色
public class Duck extends FoodDecorator { Food food; public Duck(Food food){ this.food = food; } @Override public void eat() { System.out.print("吃鸭肉\t"); food.eat(); } }
public class Chicken extends FoodDecorator { Food food; public Chicken(Food food) { this.food = food; } @Override public void eat() { System.out.print("吃鸡肉\t"); food.eat(); } }测试类:
public class Test { public static void main(String[] args) { Food rice = new Rice(); //吃米饭 rice.eat(); split(); Food duck = new Duck(rice); //吃鸭肉 米饭 duck.eat(); split(); Food chicken = new Chicken(rice); //吃鸡肉 米饭 chicken.eat(); split(); Food chickenAndDuck = new Chicken(duck); // 吃鸡肉 鸭肉 米饭 chickenAndDuck.eat(); split(); } private static void split() { System.out.println("----------------"); } }
执行结果:
吃米饭
----------------
吃鸭肉 吃米饭
----------------
吃鸡肉 吃米饭
----------------
吃鸡肉 吃鸭肉 吃米饭
----------------
Process finished with exit code 0