装饰器模式
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
我们通过下面的实例来演示装饰器模式的用法。
示例演示
我们定义一个生物接口,生物接口中有一个说话的功能。
1
2
3
4
5
6
7
8
9package test.decorator;
/**
* 所有生物的标识
*/
public interface Organism {
//所有生物共有的一个功能,有自己的沟通方式
void say();
}
定义一个人类实体类,让他具有生物的性质。
1
2
3
4
5
6
7
8
9package test.decorator;
public class People implements Organism{
public void say() {
System.out.println("people say");
}
}
接下来,重点来了,我们要对这个生物的接口进行拓展,但是其是一个原始属性的接口,所以我们定义一个抽象类,来装饰这个接口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14package test.decorator;
public class OrganismDecorator implements Organism {
protected Organism organism;
public OrganismDecorator(Organism organism) {
this.organism = organism;
}
public void say() {
organism.say();
}
}现在我们再对这个接口进行实际拓展,比如可以说中文,也可以说英文。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17package test.decorator;
public class ChineseOrganismDecorator extends OrganismDecorator{
public ChineseOrganismDecorator(Organism organism) {
super(organism);
}
public void say(){
organism.say();
this.language(organism);
}
private void language(Organism organism){
System.out.println("say Chinese");
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17package test.decorator;
public class EnglishOrganismDecorator extends OrganismDecorator {
public EnglishOrganismDecorator(Organism organism) {
super(organism);
}
public void say() {
organism.say();
this.language(organism);
}
private void language(Organism organism) {
System.out.println("say English");
}
}完成上面的步骤,我们的接口拓展就完成了,这时候我们演示一下这个接口,让某个人同时可以说中文和英文。
1
2
3
4
5
6
7
8
9
10
11
12
13
14package test.decorator;
public class DecoratorDemo {
public static void main(String[] args) {
Organism people = new People();
OrganismDecorator speak = new OrganismDecorator(people);
ChineseOrganismDecorator chinese = new ChineseOrganismDecorator(speak);
EnglishOrganismDecorator english = new EnglishOrganismDecorator(chinese);
english.say();
}
}运行结果:
1
2
3people say
say Chinese
say English
我们也可以接着创建一个动物,动物也有自己说话的方式。
1
2
3
4
5
6
7
8
9package test.decorator;
public class Animal implements Organism{
public void say() {
System.out.println("animal say");
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17package test.decorator;
public class AnimalOrganismDecorator extends OrganismDecorator {
public AnimalOrganismDecorator(Organism organism) {
super(organism);
}
public void say() {
organism.say();
this.language(organism);
}
private void language(Organism organism) {
System.out.println("say animal");
}
}实例化动物,让其有Organism的属性,但是有自己独特的说话方式
1
2
3
4
5
6
7
8
9
10
11
12package test.decorator;
public class DecoratorDemo {
public static void main(String[] args) {
Organism animal = new Animal();
OrganismDecorator animalSpeak = new OrganismDecorator(animal);
AnimalOrganismDecorator animLan = new AnimalOrganismDecorator(animalSpeak);
animLan.say();
}
}运行结果:
1
2animal say
say animal
说明
以上就是装饰器模式,这种模式的出现是为了更好的拓展功能,而尽可能的减小原结构的改造,各个类都可以独立发展,互相不耦合;缺点就是随着功能的多样化,子类会变得越来越复杂。