PizzaD
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | abstract class PizzaD { // 比萨饼
abstract PizzaD remA(); // 去除比萨饼中的凤尾鱼顶料 ( 因为太咸了 )
abstract PizzaD topAwC(); // 在凤尾鱼顶料上加上奶酪顶料 ( 这样会盖住凤尾鱼的咸味 )
abstract PizzaD subAbC(); // 将所有的凤尾鱼顶料换成奶酪顶料
}
class Crust extends PizzaD { // 面包皮
PizzaD subAbC(){
return new Crust();
}
PizzaD topAwC(){
return new Crust();
}
PizzaD subAbC(){
return new Crust();
}
}
// 下面是各种顶料
class Cheese extends PizzaD { // 奶酪
PizzaD p;
Cheese (PizzaD _p) {
p = _p;
}
PizzaD remA(){
return new Cheese(p.remA());
}
PizzaD topAwC(){
return new Cheese(p.topAwC());
}
PizzaD subAbC(){
return new Cheese(p.subAbC());
}
}
class Olive extends PizzaD { // 橄榄
PizzaD p;
Olive (PizzaD _p) {
p = _p;
}
PizzaD remA(){
return new Olive(p.remA());
}
PizzaD topAwC(){
return new Olive(p.topAwC());
}
PizzaD subAbC(){
return new Olive(p.subAbC());
}
}
class Anchovy extends PizzaD { // 凤尾鱼
PizzaD p;
Anchovy (PizzaD _p) {
p = _p;
}
PizzaD remA(){
return p.remA();
}
PizzaD topAwC(){
return new Cheese(new Anchovy(p.topAwC()));
}
PizzaD subAbC(){
return new Cheese(p.subAbC());
}
}
class Sausage extends PizzaD { // 香肠
PizzaD p;
Sausage (PizzaD _p) {
p = _p;
}
PizzaD remA(){
return new Sausage(p.remA());
}
PizzaD topAwC(){
return new Sausage(p.topAwC());
}
PizzaD subAbC(){
return new Sausage(p.subAbC());
}
}
|
如果想要在比萨饼上面添加额外的顶料怎么办?
很简单,再从 PizzaD 扩展出一个新的变体类型就可以了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Spinach extends PizzaD { // 菠菜
PizzaD p;
Spinach (PizzaD _p) {
p = _p;
}
PizzaD remA(){
return new Spinach(p.remA());
}
PizzaD topAwC(){
return new Spinach(p.topAwC());
}
PizzaD subAbC(){
return new Spinach(p.subAbC());
}
}
|
但是每添加一个新的变体类型都要加上三个方法,好累的说。
有什么比较好的办法解决这个问题呢?
下一章节给你答案。
第三条建议
当你写一个返回数据类型的方法时,使用 new 来创建值。
comments powered by Disqus