装饰者模式
装饰者模式:
意图:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰者模式相比生成子类更为灵活,该模式以对客户端透明的方式扩展对象的功能
适用环境:在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
通俗来讲,比如我们开个饮品店,主要卖牛奶,但是由于不同的需要,有的需要牛奶+糖,有的需要牛奶+珍珠,有的需要牛奶+冰等等等等,当然不同的方式,所需要的价格不一样,我们怎么办,每一种方式都写一个实现类嘛,这样实现类只会越来越多,这是我们就需要一个装饰类来处理这种事情,饮品店和牛奶就是我们被装饰的接口和被装饰的类,是比较抽象哈,上代码。
被装饰的接口:
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());//牛奶加鸡蛋加珍珠
}
}