装饰器设计模式详解

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");
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值