Hongbo

Oct 08, 2023

浅谈装饰者模式

写在前头:希望你了解到的不仅是模式,而学会用OOP的眼光分析问题,解决问题。

关键字允许向一个现有的对象添加新的功能,同时又不改变其结构

描述::通过实现相同的接口(保证行为相同)跟组合,实现对方法的增强;是继承的一个替代模式,之所以使用装饰器,不使用继承,也是对OCP和优先使用合成而非继承原则的遵守。

原则:开放封闭(OCP),优先使用合成而非继承,单一职责原则。

区别:代理模式强调的是对实际对象的控制,是客户对象与实际对象增加一个中间层。装饰者像是给实际对象的套上了一个壳子,使其一些功能得到了增强与升级

示例:不同皮肤的英雄

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
//英雄类
public interface Hero {

//英雄皮肤
public void skin();
//...其他方法与属性
}

public class GLun implements Hero {

public GLun() {};
//原始皮肤对象
@Override
public void skin() {
System.out.println("Hero is origin skin!");
}
//...其他方法与属性
}

//装饰器抽象类
public abstract class HeroDecorator implements Hero {

//包含原始对象
protected Hero hero;
//组合需要包装的对象
public HeroDecorator(Hero hero) {
this.hero = hero;
}
//...其他方法与属性
}

public class GLun_legend extends HeroDecorator {

public GLun_legend(Hero hero) {
super(hero);
}
//传奇皮肤对象
@Override
public void skin() {
setLegendSkin(hero);
}
private void setLegendSkin(Hero hero) {
System.out.println("Hero is updated to legendSkin!");
}

//test
public static void main(String[] args) {
Hero glun= new GLun();
glun.skin();

System.out.println();
Hero glun1= new GLun_legend(new GLun());
glun1.skin();

}
}
OLDER > < NEWER