设计模式7-装饰者模式

定义

在不改变原有对象的基础之上,将功能附加到对象上。提供了比继承更有弹性的替换方案。

一般拓展一个类,我们使用继承,但是继承会引入静态特征,并且随着扩展功能的增多,子类会膨胀。

实现

装饰类主要是思想,实现还是比较简单的。

就以接口来实现一个比较简单的。

1
2
3
public interface IRunner{
void run();
}

这是一个runner接口,就是跑步者,目前只提供跑步功能。

1
2
3
4
5
6
public class LiuXianng implement IRunner{
@Override
public void run(){
//跑步了
}
}

很明显,实现了这个类的

然后我们要对IRunner进行装饰了

1
2
3
4
5
6
7
8
9
10
11
public abstract class ARunnerDecorator implemennt IRunner{
protected IRunner decoratedRunner;

public ARunnerDecorator(IRunner runner){
this.decoratedRunner = runner;
}

public void walk(){
//走路
}
}

这样子就实现了一个装饰类了,这个类,既有irunner的功能(当然实现这个功能的不是它的核心作用),又可以外加一些新功能,比如说walk

1
2
3
4
5
6
7
8
9
10
public class RunnerDecorator extends ARunnerDecorator{
public RunnerDecorator(IRunner runner){
super(runner);
}

@Override
public void walk(){
//walk
}
}

后续想要使用walk的话,可以直接继承这个ARunnerDecorator

1
2
3
4
5
6
7
8
public class demo{
public static void main(String[] args){
Runner liuxiang = new LiuXiang();
liuxiang.run();
RunnerDecorator walkerLiuxiang = new RunnerDecorator(liuxiang);
walkerLiuxiang.walk();
}
}

优点

显而易见,解耦合。可以动态配置功能,也可以动态撤销

缺点

层级变深,还有分层,比较复杂