1. 模式的结构
装饰器模式主要包含以下角色。
- 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
- 具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。
- 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
- 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。
package lee.reeves;
//抽象组件
public interface Person {
void say();
}
package lee.reeves;
//具体组件
public class Citizen implements Person{
@Override
public void say() {
System.out.println("我是一个公民");
}
}
package lee.reeves;
//抽象装饰者
public abstract class DecoratorPerson implements Person{
public Person person;
public DecoratorPerson( ){
}
public DecoratorPerson( Person person){
this.person=person;
}
@Override
public void say() {
person.say();
}
}
//具体装饰者
package lee.reeves;
public class Artist extends DecoratorPerson{
public Artist(Person person) {
super(person);
}
@Override
public void say() {
super.say();
System.out.println("我是一个艺术家");
}
}
package lee.reeves;
public class Caterer extends DecoratorPerson{
public Caterer(Person person) {
super(person);
}
@Override
public void say() {
super.say();
System.out.println("我是一个送餐员");
}
}
package lee.reeves;
public class Teacher extends DecoratorPerson{
public Teacher(Person person) {
super(person);
}
@Override
public void say() {
· super.say();
System.out.println("我是一个Teacher");
}
}
package lee.reeves;
public class DecoratorTest {
public static void main(String[] args) {
Citizen citizen = new Citizen();
DecoratorPerson decoratorPerson = new Teacher(citizen);
System.out.println("--------1111---------");
decoratorPerson = new Teacher(citizen);
decoratorPerson.say();
System.out.println("--------2222---------");
decoratorPerson = new Artist(decoratorPerson);
decoratorPerson.say();
System.out.println("--------3333--------");
decoratorPerson = new Caterer(decoratorPerson);
decoratorPerson.say();
}
}