引言
还是以热干面,加鸡蛋的热干面,加牛肉的热干面举例子
代码如下
1.先创建一个面条的接口
public interface Noodle {
public String getNoodleName();
public Double getNoodlePrice();
}
写一些具体的类去实现面条,比如说热干面
public class HotDryNoodle implements Noodle{
@Override
public String getNoodleName() {
return "热干面";
}
@Override
public Double getNoodlePrice() {
return 4.0;
}
}
然后此时写一个面条的装饰器,这个装饰器应该实现有参的构造方法,传入什么面条就行,在面条的基础上加东西。
public abstract class NoodleDecorator implements Noodle{
public Noodle noodle;
public NoodleDecorator(Noodle noodle) {
this.noodle = noodle;
}
}
现在可以写加鸡蛋的热干面,加牛肉的热干面了
public class AddBeafNoodle extends NoodleDecorator {
public AddBeafNoodle(Noodle noodle) {
super(noodle);
}
@Override
public String getNoodleName() {
return noodle.getNoodleName()+"加牛肉";
}
@Override
public Double getNoodlePrice() {
return noodle.getNoodlePrice()+5.0;
}
}
public class AddEggNoodle extends NoodleDecorator{
public AddEggNoodle(Noodle noodle) {
super(noodle);
}
@Override
public String getNoodleName() {
return noodle.getNoodleName()+"加鸡蛋";
}
@Override
public Double getNoodlePrice() {
return noodle.getNoodlePrice()+2.0;
}
}
测试
public class TestMain {
public static void main(String[] args) {
HotDryNoodle hotDryNoodle = new HotDryNoodle();
AddEggNoodle eggNoodle = new AddEggNoodle(hotDryNoodle);
System.out.println(eggNoodle.getNoodleName());
System.out.println(eggNoodle.getNoodlePrice());
AddBeafNoodle beafNoodle = new AddBeafNoodle(hotDryNoodle);
System.out.println(beafNoodle.getNoodleName());
System.out.println(beafNoodle.getNoodlePrice());
AddBeafNoodle beafAndEggNoodle = new AddBeafNoodle(new AddEggNoodle(hotDryNoodle));
System.out.println(beafAndEggNoodle.getNoodleName());
System.out.println(beafAndEggNoodle.getNoodlePrice());
}
}