修饰者模式
被修饰的原始抽象类
不是接口
public abstract class AbstractMilkTea {
public abstract String descript();
public abstract double price();
}
被修饰原始抽象类的实现类
继承抽象类
public class MilkTea extends AbstractMilkTea{
@Override
public String descript() {
String string ="美味的奶茶";
return string;
}
@Override
public double price() {
double price =6;
return price;
}
}
抽象装饰者
继承了原始抽象类
public abstract class AbstractDecorator extends AbstractMilkTea{
private AbstractMilkTea abstractMilkTea;//定义一个父类,以便给子类传东西
public AbstractDecorator() {
super();
}
public AbstractDecorator(AbstractMilkTea abstractMilkTea) {
super();
this.abstractMilkTea = abstractMilkTea;
}
public AbstractMilkTea getAbstractMilkTea()
{
return abstractMilkTea;
}
public void setAbstractMilkTea(AbstractMilkTea abstractMilkTea) {
this.abstractMilkTea = abstractMilkTea;
}
@Override
public String descript() {
return abstractMilkTea.descript();//返回原始抽象类的描述
}
@Override
public double price() {
return abstractMilkTea.price();//返回原始抽象类的价格
}
}
抽象装饰类的实现类
继承抽象装饰类
public class Decorator extends AbstractDecorator
{
public Decorator() {
super();
}
public Decorator(AbstractMilkTea abstractMilkTea) {
super(abstractMilkTea);//调用父类有参数的构造方法
}
@Override
public String descript() {
return super.descript()+"加糖";//这里的descript是通过这个类的父类AbstractDecprator继承了原始抽象类,原始抽象类的子类MilkTea重写了原始抽象类的方法
}
@Override
public double price() {
return super.price()+1;
}
}
测试
public class Test01 {
public static void main(String[] args) {
MilkTea milkTea = new MilkTea();
Decorator decorator = new Decorator(milkTea);//多态
String descript = decorator.descript();
System.out.println(descript);
double price = decorator.price();
System.out.println(price);
}
}