
先贴上代码,这里直接复制了,可能没有格式,有老司机知道怎么正确贴代码的请告知,谢谢!
/**
public class TestDecorator {
public static void main(String[] args) { Persion persion = new Persion("张三"); Persion cpersion = new DecoratorClothes(persion); Persion ppersion = new DecoratorPans(cpersion); Persion spersion=new DecoratorShoes(ppersion); spersion.show(); } }
/**
public class Persion {
public Persion() { super(); } public Persion(String name) { System.out.print(name); } public void show(){}; }
/** *定义装饰者 */
public class Decorator extends Persion {
private Persion persion; public Decorator() { super(); } public Decorator(Persion persion) { this.persion = persion; } @Override public void show() { persion.show(); } }
public class DecoratorClothes extends Decorator {
public DecoratorClothes() { super(); } //super()最近的一个父类,super 相当于是指向当前对象的父类,super (参数),调用父类中的某一个构造函数。 public DecoratorClothes(Persion persion) { super(persion); } /** * 装饰动作 */ @Override public void show() { super.show(); wearClothes(); } private void wearClothes() { System.out.print(" "+"穿衣服"); } }
public class DecoratorPants extends Decorator {
public DecoratorPants() { super(); } public DecoratorPants(Persion persion) { super(persion); } @Override public void show() { super.show(); wearPants(); } private void wearPants() { System.out.print(" "+"穿裤子"); } }
public class DecoratorShoes extends Decorator {
public DecoratorShoes() { super(); } public DecoratorShoes(Persion persion) { super(persion); } @Override public void show() { super.show(); wearShoes(); } private void wearShoes() { System.out.print(" "+"穿鞋子"); } }
最后执行 show 方法,debug 执行顺序是:
1:DecoratorShoes 的 show 方法,执行第一行 super.show();
2:Decorator 的 show 方法,执行第一行 persion.show();
3:DecoratorPants 的 show 方法,执行第一行 super.show();
4:Decorator 的 show 方法,执行第一行 persion.show();
5:DecoratorClothes 的 show 方法,执行第一行 super.show();
6:Decorator 的 show 方法,执行第一行 persion.show();
7:DecoratorClothes 的 wearClothes 方法
8:Decorator 的 show 方法,执行最后的"}"
9:DecoratorPants 的 wearPants 方法
10:Decorator 的 show 方法,执行最后的"}"
11:DecoratorShoes 的 wearShoes 方法
12:结束
输出结果如下:
张三 穿衣服 穿裤子 穿鞋子
这是小子在回顾设计模式时写的 demo,从原书的 c++案例改的 java,通过重写装饰类的 show 方法,并在方法内执行需要附加的方法,完成动态的装饰效果。
小子有两处不太理解:
一是执行顺序,先 new 的对象是 DecoratorClothes,为什么测试类执行 show 方法先调用的却是 DecoratorShoes 的 show 方法?最后调用顺序却又按照了 new 对象的顺序又是为什么?小子粗略猜测是堆栈的原因,但具体要请教各位 geek 了。
二是测试类的 new 对象方式像是套用在一起,最后 new 得到的对象只执行了一次 show 方法却能分别执行三个具体装饰类的 show 方法,这是为什么,记忆上知道能这么干,但逻辑上不太理解原因,是 java 的哪个特性做到的?多态?
1 sundae91 2018-03-05 19:33:02 +08:00 super.show() wearXXX(); 第一次调用 shoes 因为 person 的是其实例;之后调用顺序就是在上两行代码中间插入父类方法,类似: super.show() super.show() super.show() wearXXX(); wearXXX(); wearXXX(); 每上一层,person 的实例都不同。 |
2 bxb100 2018-03-05 19:39:22 +08:00 你再跑下 debug 下 show 的运行流程就懂了 |