设计模式之装饰者模式

设计模式之装饰者模式

可以动态地将附加职责附加给对象。装饰器为子类化的方式提供了灵活的替代扩展功能。比如做梦梦到了交个女朋友,她的发型,发色,穿着都是根据场景做梦梦到的时候附加上去的。这时,就应该对“女朋友”这个对象实行装饰者模式来动态的、灵活的拓展。

应用场景

  1. 动态且透明地向各个对象添加职责的同时不影响其他对象。
  2. 灵活的可撤回职责。
  3. 有时候需要很多子类来用于支持每种功能的组合,这样每次增加一种功能拓展就要增加很多子类的情况。显然这样是不符合要求的。所以遇到这种多功能拓展时,需要使用装饰者模式来解决。

装饰者模式结构

装饰者模式可以大致分为四种结构(本例子中的抽象构件和抽象装饰类为一个)抽象构件,具体构件,抽象装饰类,实际装饰类。

装饰者模式

代码

第一部分:抽象构件与抽象装饰类

1
2
3
4
5
6
7
8
9
10
11
12
// 制造一个假想的“女朋友”
public abstract class AbstractGirl {

public void dyeHair() {
}

public abstract void wearClothes();

public void pack() {
}

}

第二部分:实现组件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 基本的功能实现
public class NormalGirl extends AbstractGirl {
@Override
public void dyeHair() {
System.out.println("normal hair");
}

@Override
public void wearClothes() {
System.out.println("normal clothes");
}

@Override
public void pack() {
}
}

第三部分:附加装饰类

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
// 工作中的女孩 穿正装
public class WorkGirl extends AbstractGirl {

AbstractGirl abstractGirl;

public WorkGirl(AbstractGirl abstractGirl) {
this.abstractGirl = abstractGirl;
}

@Override
public void wearClothes() {
abstractGirl.wearClothes();
System.out.println("wearClothes after : ");
System.out.println("wear formal clothes");
}
}

//实际出去逛街的女孩应该是这样的
public class FashionGirl extends AbstractGirl {

AbstractGirl abstractGirl;

public FashionGirl(AbstractGirl abstractGirl) {
this.abstractGirl = abstractGirl;
}

@Override
public void dyeHair() {
abstractGirl.dyeHair();
System.out.println("dyeHair after : ");
System.out.println("dye blue hair");
}

@Override
public void wearClothes() {
abstractGirl.wearClothes();
System.out.println("wearClothes after : " );
System.out.println("wear rock type clothes");
}

@Override
public void pack() {
abstractGirl.pack();
System.out.println("wearClothes after : " );
System.out.println("take fashion pack");
}
}

最后客户端的调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

public class App {
public static void main(String[] args) {
//先制造一个整体组件
AbstractGirl normalGirl = new NormalGirl();
normalGirl.dyeHair();
// 为组件添加装饰,比如这里加了个时尚的包包
AbstractGirl fashionHair = new FashionGirl(normalGirl);
fashionHair.pack();
//穿一套正装
AbstractGirl workClose = new WorkGirl(fashionHair);
workClose.wearClothes();
}
}
-------------本文结束感谢您的阅读-------------

本文标题:设计模式之装饰者模式

文章作者:NanYin

发布时间:2019年06月10日 - 12:06

最后更新:2019年08月12日 - 13:08

原始链接:https://nanyiniu.github.io/2019/06/10/2019-06-10-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E4%B9%8B%E8%A3%85%E9%A5%B0%E8%80%85%E6%A8%A1%E5%BC%8F/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。