设计模式之装饰者模式

装饰者模式又名包装模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,他是对原有功能的扩充,在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());两次包装。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值