Java 设计模式之装饰模式
概述
装饰模式(Decorator),动态地给一个对象添加一些额外的职责,比直接生成子类更为灵活。
UML图
- Component:抽象接口,给对象动态的添加职能。
- ConcreteComponent:继承Component,具体被装饰对象。
- Decorator:抽象装饰类,继承Component,扩展Component类的功能。
- ConcreteDecorator:具体装饰者类。
代码实现
定义抽象接口:
public abstract class Component {
public abstract void dressUp();
}
定义被装饰类:
public class Boy extends Component {
@Override
public void dressUp() {
System.out.println("男生穿西装");
}
}
public class Girl extends Component {
@Override
public void dressUp() {
System.out.println("女生穿裙子");
}
}
定义抽象装饰类:
public abstract class Decorator extends Component {
private Component person;
public Decorator(Component person) {
this.person = person;
}
@Override
public void dressUp() {
person.dressUp();
}
}
定义具体装饰者类:
public class BoyDecorator extends Decorator {
public BoyDecorator(Component person) {
super(person);
}
@Override
public void dressUp() {
takeNecktie();
super.dressUp();
takeLeatherShoes();
}
private void takeNecktie() {
System.out.println("打领带");
}
private void takeLeatherShoes() {
System.out.println("穿皮鞋");
}
}
public class GirlDecorator extends Decorator {
public GirlDecorator(Component person) {
super(person);
}
@Override
public void dressUp() {
takeStocking();
super.dressUp();
takeHighheeledShoes();
}
private void takeStocking() {
System.out.println("穿长袜");
}
private void takeHighheeledShoes() {
System.out.println("穿高跟鞋");
}
}
使用:
public class Client {
public static void main(String[] args) {
Component boy = new Boy();
BoyDecorator boyDecorator = new BoyDecorator(boy);
boyDecorator.dressUp();
Component girl = new Girl();
GirlDecorator girlDecorator = new GirlDecorator(girl);
girlDecorator.dressUp();
}
}
输出:
打领带
男生穿西装
穿皮鞋
穿长袜
女生穿裙子
穿高跟鞋