装饰模式(详解+代码注释)

本文介绍装饰模式的概念、应用场景及实现方式,通过示例代码演示如何利用装饰模式为对象动态添加职责,同时讨论装饰模式的优点和局限。

装饰模式

我们在IO中见到过不少装饰模式,装饰模式就是对原有对象进行增强。
一般实现对象增强的三种方式:继承、装饰模式、代理模式

一、为什么需要装饰模式?

我们知道,子类继承父类,可以继承父类的属性,并进行扩展,但是如果需求变动大,需要扩展的功能很多,这时用继承就会发生这样一种现象:类数量多,继承的层次多。
所以像这种情况,如果用继承就非常不灵活。因此引入了装饰模式。

二、代码实现

前置代码:我们有一个电话接口Phone,和一个电话接口的实现类Iphone,Iphone的基础功能base()只有打电话。

  1. 写一个装饰器抽象类,用其构造器来接收实现类。装饰器的核心其实就是代理
  2. 继承装饰器抽象类,将想要增强的对象传进去,扩展功能并重写base()方法。这样我们就得到了被增强装饰后的对象iphone2。iphone2这个对象就具有了被增强之后的功能(打电话,发信息,听音乐)。

代码实现+注释:

//电话接口
interface Phone{
	void base();//可以打电话
}
//实现类:
class Iphone implements Phone{
	public void base(){
		System.out.println("打电话");
	}
}
//此时我们有一个电话接口,一个电话的实现类,我们创建一个装饰器,它实现了电话接口,以组合的方式接收我们的默认实现类
abstract class Dec implements Phone{
	private Phone phone;
	public Dec(Phone phone){
		this.phone = phone;
	}
	public void call() {
		phone.base();
	}
}
	
	//继承装饰器来进行扩展
	class Iphone2 extends Dec{

		public Iphone2(Phone phone) {
			super(phone);
		}
		//扩展的功能
		public void sendMessage() {
			System.out.println("发短信");
		}	
		public void music() {
			System.out.println("听音乐");
		}
		@Override
		//重写电话的基本功能
		public void base() {
			super.call();
			sendMessage();
			music();
		}
	}

//测试类
public class Test1 {
	public static void main(String[] args) {
		Iphone ipohne = new Iphone();
        Iphone2 iphone2= new Iphone2(iphone);
        iphone2.base();
	}

}



其实我们发现,这其实和IO的装饰模式是一样的

   public static void main(String[] args) {
		//原始的对象
		Iphone ipohne = new Iphone();
		//增强后的对象
        Iphone2 iphnoe2= new Iphone2(iphone);
        ip2.base();
	}

三、装饰模式的优缺点

优点:
1.装饰类和被装饰类是可以互相独立的。低耦合
2.无论包装多少层,返回的对象都是is-a关系(包装完还是Phone类型)

is -a关系:苹果继承自水果,这是一种is-a关系,因为水果里肯定有苹果,这是种天然的关系,苹果继承自午饭,这是一种has-a关系,因为午饭可以有苹果也可以没有。
3.实现动态扩展,只要继承了装饰器就可以动态扩展想要的功能。

缺点:
多层装饰复杂,不利于调试

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值