java 装饰设计模式

今天讲下设计模式中的装饰设计模式,这个在我门的IO流已经使用到了,首先看下对装饰设计模式的定义

定义:

动态的给一个对象添加一些额外的功能,就新增功能来说,装饰模式比生成子类更加灵活.
总结起来装饰设计模式2个作用:

2个作用
1:为对象添加功能,
2:添加功能是动态的

装饰器模式具有如下的特征: 
它必须具有一个装饰的对象。 它必须拥有与被装饰对象相同的接口。 它可以给被装饰对象添加额外的功能。 用一句话总结就是:保持接口,增强性能

现在用代码实现以下更为直观
比如手机只能打电话,那我现在想打电话之前先听到彩铃,电话挂断后还可以继续听歌
//电话的功能,  
public interface Phone {
   public void call();
}
具体某个电话的实现类
public class IPhone implements Phone {
	public IPhone() {
		super();
	}
	@Override
	public void call() {
		System.out.println("打电话");
	}
}
//装饰类的功能的扩展,但要保持有打电话功能
public abstract class PhoneDecorator implements Phone {
	private Phone phone;
	
	public PhoneDecorator(Phone phone) {
		super();
		this.phone = phone;
	}

	@Override
	public void call() {
         phone.call();
	}
}
//彩铃具体装饰类的实现,并添加功能
public class RingDecorator extends PhoneDecorator {

	public RingDecorator(Phone phone) {
		super(phone);
	}
	
	@Override
	public void call() {
		System.out.println("我要手机可以听彩铃");
		super.call();
		
	}
}
//音乐具体装饰类的实现 并添加播放音乐的功能
public class MusicDecorate extends PhoneDecorator {

	public MusicDecorate(Phone phone) {
		super(phone);
	}
	
	@Override
	public void call() {
		super.call();
		System.out.println("手机可以听音乐");
	}
}
测试类
public class DecoratorTest {
		public static void main(String[] args) {
			Phone phone = new IPhone();
			phone.call();
			System.out.println("*************************");
			PhoneDecorator pd = new RingDecorator(phone);
			pd.call();
			System.out.println("*************************");
			pd = new MusicDecorate(phone);
			pd.call();
			System.out.println("*************************");
			//现在是打电话之前有彩铃来了 挂断电话后可以听因为
			pd = new MusicDecorate(new RingDecorator(phone));
			pd.call();
		}
}
结果:

打电话
*************************
我要手机可以听彩铃
打电话
*************************
打电话
手机可以听音乐
*************************
我要手机可以听彩铃
打电话
手机可以听音乐






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值