定义:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生产子类更灵活
使用场景:需要透明且动态地扩展类的功能时。
/**
* 主体抽象类
*/
public abstract class Person {
public abstract void dressed();
}
/**
* 主体实现类
*/
public class Boy extends Person {
@Override
public void dressed() {
System.out.println("穿了内衣内裤");
}
}
/**
* 装饰抽象类
*/
public abstract class PersonCloth extends Person {
protected Person mPerson;
public PersonCloth(Person mPerson){
this.mPerson=mPerson;
}
@Override
public void dressed() {
mPerson.dressed();
}
}
/**
* 装饰实现类1
*/
public class JeanCloth extends PersonCloth {
public JeanCloth(Person mPerson) {
super(mPerson);
}
void dressJean() {
System.out.println("穿条牛仔裤");
}
@Override
public void dressed() {
super.dressed();
dressJean();
}
}
/**
* 装饰实现类2
*/
public class LeatherCloth extends PersonCloth {
public LeatherCloth(Person mPerson) {
super(mPerson);
}
void dressLeather(){
System.out.println("穿件皮衣");
}
@Override
public void dressed() {
super.dressed();
dressLeather();
}
}
/**
* 装饰实现类3
*/
public class ShirtCloth extends PersonCloth {
public ShirtCloth(Person mPerson) {
super(mPerson);
}
void dressShirt(){
System.out.println("穿件短袖");
}
@Override
public void dressed() {
super.dressed();
dressShirt();
}
}
/**
* 使用类
*/
public class Main {
public static void main(String[] args) {
Person mPerson = new Boy();
//穿短袖
PersonCloth mPersonCloth = new ShirtCloth(mPerson);
//穿皮衣
mPersonCloth = new LeatherCloth(mPersonCloth);
//穿牛仔裤
mPersonCloth = new JeanCloth(mPersonCloth);
mPersonCloth.dressed();
}
}
在使用类Main中我们可以透明动态的为主体Boy添加新功能。