装饰者模式又名包装模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,他是对原有功能的扩充,在IO流中这个设计模式用的特别多。现在总结下装饰者模式。
例如:手机具有打电话的功能,现在我需要在打电话之前听音乐铃声,打完之后看天气预报,在这里例子中就可以用到装饰者模式进行设计。
1、定义一个手机的抽象类
public interface Phone {
public abstract void call() ;// 打电话
}
2、定义一个具体的手机类,它也具有打电话的功能
public class IPhone implements Phone {
@Override
public void call() {
System.out.println("打电话...................");
}
}
3、定义一个装饰的公共类,父类
public class PhoneDecorate implements Phone {
private Phone phone ;
public PhoneDecorate(Phone phone) {
this.phone = phone ;
}
@Override
public void call() {
phone.call() ;
}
}
4、定义一个听音乐的装饰类
public class ListenMusicDecorat extends PhoneDecorate {
public ListenMusicDecorat(Phone phone) {
super(phone);
}
@Override
public void call() {
System.out.println("听音乐.............");
super.call() ;
}
}
5、定义一个看天气预报的装饰类
public ListenWeatherForecastDecorat(Phone phone) { super(phone); }
@Override
public void call() {
super.call();
System.out.println("听天气预报................");
}
}
6、装饰者模式的实现类
public class DecoratDemo {
public static void main(String[] args) {
// 创建IPhone的对象
IPhone iPhone = new IPhone() ;
iPhone.call() ;
System.out.println("-------------------------------------------------");
ListenMusicDecorat listenMusicDecorat = new ListenMusicDecorat(iPhone) ;
listenMusicDecorat.call() ;//听音乐,打电话
System.out.println("-------------------------------------------------");
ListenWeatherForecastDecorat listenWeatherForecastDecorat = new ListenWeatherForecastDecorat(iPhone) ;
listenWeatherForecastDecorat.call() ;//打电话,看预报
System.out.println("-------------------------------------------------");
ListenMusicDecorat decorat = new ListenMusicDecorat(new ListenWeatherForecastDecorat(new IPhone())) ;
decorat.call() ;//听音乐,打电话,看预报
}
}
上面的包装类似于:
Scanner sc = new Scanner(System.in);//包装一次
BufferedReader reader = new BufferedReader (new BufferInputStream(new FileInputStream());两次包装。