首页 > 代码库 > 装饰设计模式

装饰设计模式

装饰设计模式:就是使用被装饰类的一个子类的实例,在客户端这个子类的实例交给装饰类,是继承的替代方案

  如一个手机设计

1、要设计一个手机,自带打电话功能,而手机属于一个接口

2、手机下面有个具体的子类,属于确定的对象,比如Iphone,但是Iphone也是一个手机,要实现手机接口

3、手机有比如彩铃、听音乐等功能,这些功能就属于装饰类,把它们弄成一个装饰类,也需要实现手机接口。

4、彩铃功能,属于继承第3部的装饰类的功能,比如设置彩铃是在手机打电话之前实现的。

5、听音乐功能,属于继承第3部的装饰类的功能,比如设置听音乐是在手机打电话之后实现的。

6、测试手机,首先创建Iphone手机的具体对象,而Iphone也是一个手机;实现手机装饰功能:彩铃、听音乐。

 

  代码如下

package cn.idcast5;

public interface Phone {
public  abstract void call();
}
package cn.idcast5;

public class Iphone implements Phone{

	@Override
	public void call() {
		// TODO Auto-generated method stub
		System.out.println("手机可以打电话了");
	}

}
package cn.idcast5;

public abstract class PhoneDecorate implements Phone {
  private Phone p;
  public  PhoneDecorate(Phone p) {
	  this.p=p;
  }
	@Override
	public void call() {
		// TODO Auto-generated method stub
          this.p.call();
	}

}
package cn.idcast5;

public class RingPhoneDecorate extends PhoneDecorate {
public RingPhoneDecorate(Phone p) {
		super(p);
	}
	@Override
	public void call() {
		// TODO Auto-generated method stub
		System.out.println("手机可以听彩铃了");
		super.call();
	}
}
package cn.idcast5;

public class MusicPhoneDecorate extends PhoneDecorate {
public MusicPhoneDecorate(Phone p) {
		super(p);
		// TODO Auto-generated constructor stub
	}

@Override
	public void call() {
		// TODO Auto-generated method stub
		super.call();
		System.out.println("手机可以听音乐了");
	}
}
package cn.idcast5;

public class PhoneDemo {
public static void main(String[] args) {
	Phone p = new Iphone();
	PhoneDecorate pd = new RingPhoneDecorate(new MusicPhoneDecorate(p));
	pd.call();
}
}

  

  结果显示为:

 技术分享

装饰设计模式