装饰者模式:
意图:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰者模式相比生成子类更为灵活,该模式以对客户端透明的方式扩展对象的功能
适用环境:在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
通俗来讲,比如我们开个饮品店,主要卖牛奶,但是由于不同的需要,有的需要牛奶+糖,有的需要牛奶+珍珠,有的需要牛奶+冰等等等等,当然不同的方式,所需要的价格不一样,我们怎么办,每一种方式都写一个实现类嘛,这样实现类只会越来越多,这是我们就需要一个装饰类来处理这种事情,饮品店和牛奶就是我们被装饰的接口和被装饰的类,是比较抽象哈,上代码。
被装饰的接口:
public interface Milk { /** * 计算价格 */ float price(); /** * 牛奶成分的描述 */ String describe(); }
被装饰的类:
public class DrinkMilk implements Milk { @Override public float price() { return 10f; } @Override public String describe() { return "牛奶"; } }
具体的装饰类:
public abstract class Decorator implements Milk { private final Milk milk; public Decorator(Milk milk) { this.milk = milk; } @Override public float price() { return milk.price(); } @Override public String describe() { return milk.describe(); } }
比如加鸡蛋(我们只需要继承这个装饰类就可以了)
public class Egg extends Decorator { public Egg(Milk milk) { super(milk); } @Override public float price() { return super.price() + 2; } @Override public String describe() { return super.describe() + "加鸡蛋"; } }
同样,比如加珍珠
public class Pearl extends Decorator { public Pearl(Milk milk) { super(milk); } @Override public float price() { return super.price() + 2; } @Override public String describe() { return super.describe() + "加珍珠"; } }
测试代码
public class Test1 { public static void main(String[] args) { // 一杯牛奶 Milk milk = new DrinkMilk(); // 加鸡蛋 Egg egg = new Egg(milk); // 加珍珠 Pearl pearl = new Pearl(egg); System.out.println(pearl.price());// 14.0 System.out.println(pearl.describe());//牛奶加鸡蛋加珍珠 } }