装饰模式;
给一个类添加一些额外的职责,并且在添加这些额外的职责时不会控制该类的执行逻辑。
适用场景:
1.程序希望动态地增强类的某个对象的功能,而又不影响到该类的其他对象。
2.采用继承来增强对象功能不利于系统的扩展和维护。
举个简单的例子:
麻雀类的实例(麻雀)能飞行100米,如果用麻雀类创建了5只麻雀,那么这5只麻雀都能飞行100米。假如想让其中一只能飞150米,怎么办?当然你可以在创建个特殊的麻雀类继承麻雀类,再实例化这个特殊的麻雀类。但是考虑到程序的扩展性,以及设计的一个基本原则:少用继承,多用组合。装饰模式就是一个很好的解决办法。在麻雀的这个例子,我们可以给这只特殊的麻雀装饰上一个电子翅膀,这样使它区别于其它麻雀。
代码如下:
Bird类:
public abstract class Bird {
public abstract int fly();
}
具体组件:
Sparrow.java
public class Sparrow extends Bird {
private final int DISTANCE = 100;
@Override
public int fly() {
return DISTANCE;
}
}
装饰
Decorator.java
public abstract class Decorator extends Bird {
protected Bird bird;
public Decorator(Bird bird) {
this.bird = bird;
}
}
具体装饰:
SparrowDecorator.java
public class SparrowDecorator extends Decorator {
public final int DISTANCE = 50;
SparrowDecorator(Bird bird) {
super(bird);
}
@Override
public int fly() {
int distance = 0;
distance = bird.fly() + eleFly();
return distance;
}
private int eleFly() {
return DISTANCE;
}
}
装饰模式使用:
public class Application {
private static void needBird(Bird bird) {
int flyDistance =bird.fly();
System.out.println("飞行距离"+flyDistance+"米");
}
public static void main(String[] args) {
Bird sparrowBird =new Sparrow();
Bird sparrowBird2=new SparrowDecorator(sparrowBird);
Bird sparrowBird3 =new SparrowDecorator(sparrowBird2);
needBird(sparrowBird);
needBird(sparrowBird2);
needBird(sparrowBird3);
}
}
Uml图如下:
|
|