浅谈Java设计模式——装饰模式(Decorator)
一、概述
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
二、使用场景
1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
2.处理那些可以撤消的职责。
3.当不能采用生成子类的方法进行扩充时。
三、参与者
1.Component 定义一个对象接口,可以给这些对象动态地添加职责。
2.ConcreteComponent 定义一个对象,可以给这个对象添加一些职责。
3.Decorator 维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。
4.ConcreteDecorator 就是具体的装饰对象,起到该Component添加职责的功能。
四、类图
五、代码示例
1.Component接口:
/**
* 定义Component接口Person
* @author zhipeng_Tong
*/
public interface Person {
void speak();
}
2.ConcreteComponent:
/**
* ConcreteComponent类,即Person的实现类
* @author zhipeng_Tong
*/
public class Speaker implements Person {
@Override
public void speak() {
System.out.println("时光的荏苒");
}
}
3.Decorator抽象类:
/**
* Decorator抽象类,实现了(Component接口的)Person
* @author zhipeng_Tong
*/
public abstract class Decorator implements Person {
protected Person person;
public void setPerson(Person person) {
this.person = person;
}
@Override
public void speak() {
if (person != null)
person.speak();
}
}
4.ConcreteDecorator装饰类:
public class ConcreteDecoratorA extends Decorator {
@Override
public void speak() {
super.speak();
seconedSpeak();
System.out.println("ConcreteDecoratorA...Over");
}
private void seconedSpeak() {
System.out.println("它蹉跎了所有");
}
}
public class ConcreteDecoratorB extends Decorator {
@Override
public void speak() {
super.speak();
seconedSpeak();
System.out.println("ConcreteDecoratorB...Over");
}
private void seconedSpeak() {
System.out.println("他向我...");
}
}
5.测试代码
public class Client {
public static void main(String[] args) {
Speaker speaker = new Speaker();
ConcreteDecoratorA concreteDecoratorA = new ConcreteDecoratorA();
ConcreteDecoratorB concreteDecoratorB = new ConcreteDecoratorB();
concreteDecoratorA.setPerson(speaker);
concreteDecoratorB.setPerson(concreteDecoratorA);
concreteDecoratorB.speak();
}
}
运行结果:
时光的荏苒
它蹉跎了所有
ConcreteDecoratorA...Over
他向我...
ConcreteDecoratorB...Over