public class Main {
public static void main(String[] args) {
//
//代码先看各类的实现,最后再看测试类Main//
/
InterA interA=new A();
InterA interAChinese=new Chinese(interA);
//这里别忘了,我们传的实参interA会改变Chinese父类的Decorator类的interA字段的值,
//现在Chinese speak()方法里的this.interA.speak()调的是A类的speak()
InterA interAEnglish=new English(interAChinese);
//我们传的实参interAChinese会改变English父类的Decorator类的interA字段的值,
//现在English speak()方法里的this.interA.speak()调的是Chinese类的speak()
interAEnglish.speak();
/*
* 分析:
* interAEnglish.speak();
* 走了English类的speak()方法
* 在English的speak()方法中
*
* interAEnglish.speak(){
* System.out.println("I can speak English");
* this.interA.speak();调的是Chinese类的speak()
* public void speak() {这是Chinese类的speak方法
* speakChniese();
* System.out.println("我会将普通话");
* this.interA.speak();调的是A类的speak()
* public void speak() {这是A类的speak()
* System.out.println("实例化一个被装饰对象");
*
*
* 我认为装饰者通过Decorator的字段interA形成了链式引用,达到了不断为装饰对象增加功能的目的
*
* */
}
}
///
//先从这里往下看//
//
interface InterA {//被装饰对象的接口
void speak();
}
class A implements InterA{//为了实例化一个 ---被装饰 --- 对象,有必要,后便会解释
@Override
public void speak() {
// TODO Auto-generated method stub
System.out.println("实例化一个被装饰对象");
}
}
abstract class Decorator implements InterA {//具体--装饰对象--的抽象类
InterA interA;
public Decorator(InterA interA) {
this.interA = interA;
}
}
class Chinese extends Decorator {//具体--装饰对象--
public Chinese(InterA interA) {
super(interA);//super 调父类构造器,即抽象的Decorator 即把当前的形参interA传到父类的interA字段
}
@Override
public void speak() {
speakChniese();
//我认为下边这一句是最精髓的一句
this.interA.speak();//this.interA是从抽象的Decorator继承过来的,所以调的是父类的speak
}
public void speakChniese() {//子类所具有的能力
System.out.println("我会将普通话");
}
}
class English extends Decorator {
public English(InterA interA) {
super(interA);//super 调父类构造器,即抽象的Decorator 即把当前的形参interA传到父类的interA字段
}
@Override
public void speak() {
speakEnglish();
this.interA.speak();//this.interA是从抽象的Decorator继承过来的,所以调的是父类的speak
}
public void speakEnglish() {//子类所具有的能力
System.out.println("I can speak English");
}
}