一、定义
装饰模式是动态的扩展对象的功能,它是继承关系的另一种替代方案,比继承更加灵活。
二、实现
这里以人穿衣服为例,首先抽象出一个Person类,它有一个dressed()方法。
/**
* 抽象组件类(Component)
*/
public abstract class Person {
//抽象方法
public abstract void dressed();
}
接着定义一个Person的具体实现类XiaoMing,同时重写了dressed()方法。
/**
* 组件具体实现类(ConcreteComponent)
*/
public class XiaoMing extends Person {
@Override
public void dressed() {
System.out.println("穿了秋衣秋裤");
}
}
然后再定义一个抽象装饰类,它继承Person类,并持有一个Person对象的引用
/**
* 抽象装饰类(Decorator)
*/
public abstract class PersonCloth extends Person {
//持有Person对象的引用
private Person person;
public PersonCloth(Person person) {
this.person = person;
}
@Override
public void dressed() {
//调用Person类中的dressed()方法
person.dressed();
}
}
再定义一个装饰者具体实现类,里面定义了两个新的装饰方法dressJacket()和dressJean()
/**
* 装饰者具体实现类
*/
public class NewCloth extends PersonCloth {
public NewCloth(Person person) {
super(person);
}
@Override
public void dressed() {
super.dressed();
dressJacket();
dressJean();
}
/**
* 自定义的装饰方法
*/
private void dressJacket() {
System.out.println("穿上夹克");
}
/**
* 自定义的装饰方法
*/
private void dressJean() {
System.out.println("穿上牛仔裤");
}
}
最后来看测试类
public class Test {
public static void main(String[] args) {
//定义XiaoMing对象
Person person = new XiaoMing();
//给XiaoMing穿上新的衣服
PersonCloth personCloth = new NewCloth(person);
personCloth.dressed();
}
}
结果:
穿了秋衣秋裤
穿上夹克
穿上牛仔裤