定义:允许向一个现有的对象添加新的功能,同时又不改变其结构。
使用场景:能够动态地扩展类的功能
应用举例:一个画可以被装在画框里,并且被蒙上玻璃,这时候画,玻璃,画框组成了一个东西。
类图:
- Comppoent: 抽象组件
- ConcreteComponet:组件的具体实现类
- Decorator:抽象装饰者,
- ConcreteDecoratorA:装饰者具体实现类
- ConcreteDecoratorB:装饰者具体实现类
- Client:客户类
关键代码:
- Component 类充当抽象角色,不应该具体实现。
- 修饰类引用和继承 Component 类,具体扩展类重写父类方法。
- 与建造者方法不同,抽象装饰类声明了装饰着,但没有初始化。
优点:
- 装饰类与被装饰者可以相互发展,不相互耦合。
- 是继承的一个替代模式,可以动态扩展一个实现类的功能。
缺点:需要很多装饰的话,会比较复杂。
abstract class Person{
public abstract void dressed();
}
//ConcreteComponet:组件的具体实现类
class Boy extends Person{
@Override
public void dressed() {
// TODO 自动生成的方法存根
//实现最基本的逻辑
System.out.println("王小明穿了内衣内裤");
}
}
//Decorator:抽象装饰者,
abstract class PersonCloth extends Person{
protected Person mPerson;
public PersonCloth(Person person) {
mPerson = person;
}
public void dressed() {
mPerson.dressed();
}
}
class ExpensiveCloth extends PersonCloth{
public ExpensiveCloth(Person person) {
super(person);
// TODO 自动生成的构造函数存根
}
private void dressShirt() {
System.out.println("还穿上了昂贵的短袖");
}
private void dressJean() {
System.out.println("还穿上了昂贵的牛仔裤");
}
public void dressed(){
super.dressed();
dressShirt();
dressJean();
}
}
class CheapCloth extends PersonCloth{
public CheapCloth(Person person) {
super(person);
// TODO 自动生成的构造函数存根
}
private void dressShirt() {
System.out.println("还穿上了便宜的短袖");
}
private void dressJean() {
System.out.println("还穿上了便宜的牛仔裤");
}
public void dressed(){
super.dressed();
dressShirt();
dressJean();
}
}
主函数
public static void main(String[] args) {
Person person = new Boy();
//穿上便宜的衣服
PersonCloth cheapCloth = new CheapCloth(person);
cheapCloth.dressed();//展示出来
System.out.println();
PersonCloth expensiveCloth = new ExpensiveCloth(person);
expensiveCloth.dressed();
}
运行截图