装饰模式

装饰模式要达到的目的:装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

1.类图


2.具体实例

2.1 Application


package Decorator;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* Created by 15581 on 2017/11/8.
*/ // Observer.Application.java
public class Application{
public void needBird(Bird bird){
int flyDistance=bird.fly();
System.out.println("这只鸟能飞行"+flyDistance+"米");
}
public static void main(String args[]){
Application client=new Application();
Sparrow sparrow=new Sparrow();
SparrowDecorator sparrowDecorator1=
new SparrowDecorator(sparrow);
SparrowDecorator sparrowDecorator2=
new SparrowDecorator(sparrowDecorator1);
client.needBird(sparrowDecorator1);
client.needBird(sparrowDecorator2);
}
}

2.2 Bird


1
2
3
4
5
6
package Decorator;

// Bird.java
public abstract class Bird{
public abstract int fly();
}

2.3 Decorator


1
2
3
4
5
6
7
8
9
10
11
12
13
package Decorator;

/**
* Created by 15581 on 2017/11/8.
*/ // Decorator.java
public abstract class Decorator extends Bird{
protected Bird bird;
public Decorator(){
}
public Decorator(Bird bird){
this.bird=bird;
}
}

2.4 Sparrow


1
2
3
4
5
6
7
8
9
10
11
package Decorator;

/**
* Created by 15581 on 2017/11/8.
*/ // Sparrow.java
public class Sparrow extends Bird{
public final int DISTANCE=100;
public int fly(){
return DISTANCE;
}
}

2.5 SparrowDecorator


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package Decorator;

/**
* Created by 15581 on 2017/11/8.
*/ // SparrowDecorator.java
public class SparrowDecorator extends Decorator{
public final int DISTANCE=50; //eleFly方法能飞米
SparrowDecorator(Bird bird){
super(bird);
}
public int fly(){
int distance=0;
distance=bird.fly()+eleFly(); //委托被装饰者bird调用fly(),然后再调用eleFly()
return distance;
}
private int eleFly(){ //装饰者新添加的方法
return DISTANCE;
}
}

2.6 SparrowDecoratorTwo


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package Decorator;

/**
* Created by 15581 on 2017/11/8.
*/ // SparrowDecoratorTwo.java
public class SparrowDecoratorTwo extends Decorator{
public final int DISTANCE=20;
SparrowDecoratorTwo(Bird bird){
super(bird);
}
public int fly(){
int distance=0;
distance=bird.fly()+eleFly();
return distance;
}
public int eleFly(){
return DISTANCE;
}
}