【注意】最后更新于 January 15, 2018,文中内容可能已过时,请谨慎使用。
本文来讨论下java设计模式之装饰模式。
什么是装饰模式呢?
把一些附加的功能添加到主功能上。注意了,划重点,是动态的添加!随时随地可以删除,改变顺序!
就比如我做饭,核心功能就是煮了,但是在这之前,我可以淘大米,也可以不淘,之后可以不评价,也可以看到老板的青龙白虎文身而评价。这些功能都是动态的,所需要的就是在核心功能上的变动。
首先,我们定义最基本的做饭
1
2
3
4
5
6
7
8
9
10
11
|
package top.txiner.decorator;
/**
* @author : hundred
* time: 18-1-15
* website : http://txiner.top
* 懵懂的小白
*/
public interface Cook {
void boil();
}
|
我们做粥的时候,就是把煮的过程给实现了就好了,用心做好饭!(爱的味道,银鹭八宝粥!)
1
2
3
4
5
6
|
public class Porridge implements Cook {
@Override
public void boil() {
System.out.println("boil porridge");
}
}
|
做好饭了,理论上我们就可以吃了,不过别着急!
为了保证健康,我们还是做之前淘下米吧。干净卫生!
考虑到我们要动态的功能不局限在淘米过程,还有看文身的过程,所以我们直接集成Cook来淘米不合适,要不然就写死了!
所以,我们先抽象个附加功能的基类
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class Decorator implements Cook {
private Cook cook;
public Decorator(Cook cook) {
this.cook = cook;
}
@Override
public void boil() {
this.cook.boil();
}
}
|
要加啥功能,加上!没毛病!
淘米吧!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class Wash extends Decorator {
public void washRice(){
System.out.println("I have to wash rice");
}
public Wash(Cook cook) {
super(cook);
}
@Override
public void boil() {
this.washRice();
super.boil();
}
}
|
这次做的确实好吃,就算老板没拿刀架我脖子上,我也要说好吃!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class Taste extends Decorator {
public Taste(Cook cook) {
super(cook);
}
public void comment(){
System.out.println("I think the porridge is good");
}
@Override
public void boil() {
super.boil();
this.comment();
}
}
|
恩,完工!
等等,我们就是提出了这些附加功能,还没开吃呢!
1
2
3
4
5
6
7
8
9
|
public class Customer {
public static void main(String[] args) {
Cook porridge=new Porridge();
porridge=new Wash(porridge);
porridge=new Taste(porridge);
porridge.boil();
}
}
|
好了!
老板,刀可以拿走了嘛!
................分割..................
装饰模式,我感觉还是一个比较灵活的模式的,但不知道为什么,总是会想到java的注解(python的装饰模式表达的时候语法就很像java的注解),以后找时间对比下,然后试一试。