装饰器模式

装饰器模式就是给对象添加一些额外的实现,就像房子装修一样,本来已经成型的实现,现在要给它做一些装饰,实现更多的功能。

三个注意点:

1、装饰器必须要装饰一个对象

2、装饰器对象与被装饰对象必须要实现同一个接口

3、通过写入新的方法增强被装饰对象的功能

------------------------这种思想是不是很像springAOP,切入增强。

 

下面以例子具体说说:

首先建立一个接口

package decorator;

public interface InterF {
	int mod(int num);
}

此接口需要返回一个int型的值,java的接口方法必须都是public的,所以public关键字可以省掉不写


下面针对这个接口写实现方法,这个方法是最初的实现,可能像下面这样

package decorator;

public class Hours implements InterF {
	@Override
	public int mod(int num) {
		if (num < 0) {
			System.out.println("请输入大于等于0的数字");
			return 0;
		}
		return num % 2;
	}
}

我们可以把装饰器模式比作一个房子,现在我们先定义的房子的实现,这个方法返回num%2的值。很简单。


然后装饰器登场,我们需要对这个房子进行一些装饰,也告知调用者一些新的东西,具体实现可能会是下面这样

package decorator;

public class Decorator implements InterF {

	private InterF interF;

	public void setInterF(InterF interF) {
		this.interF = interF;
	}

	@Override
	public int mod(int num) {
		// TODO Auto-generated method stub
		System.out.println("Start to mod...");
		return interF.mod(num);
	}

}

注意,我们先在这个装饰器中申明了一个私有的InterF,然后写了一个setInterF方法导入外部实现了接口InterF的具体对象,然后装饰类自己也实现了InterF接口的mod方法,接着我们在调用外部对象方法之前加入了增强实现,此处我们告知用户下面开始mod了


下面写个测试类

package decorator;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Decorator decorator=new Decorator();
		Hours hours=new Hours();
		decorator.setInterF(hours);
		System.out.println(hours.mod(4));
		System.out.println("-----------------------------");
		System.out.println(decorator.mod(4));
	}

}

你可以看到结果如下:

0
-----------------------------
Start to mod...
0

总结:我个人觉得装饰器这种设计模式相对是较为简单的,使用的方式也很像spring的AOP,在真正要实现的方法的前后写入增强,丰富我们的方法。当然,实际上,也是可以直接修改原Hours类写入相关的增强功能,但是这就有可能破坏我们之前的封装,显得不是很必要,或许装饰器实现也只是一种临时实现。


引申一下,装饰器对象和被装饰对象都实现了同一个接口,个人认为极大限制了类的能力,只能简单的在原方法的基础上,增加装饰,此例中,如果我想把经过装饰的Hours由返回1或者0,改为返回Boolean型的值,需要怎么做?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值