定义:动态地给一个对象添加一些额外的职责,是继承关系的一个替代方案
结构:
- 抽象组件:被装饰的原始对象抽象,接口或者抽象类
- 具体组件:组件的具体实现,是装饰的具体对象
- 抽象装饰者:装饰组件对象,内部有一个指向组件对象的引用,通常为抽象类
- 具体装饰着:装饰着具体实现
适用场景:需要透明且动态扩展类的功能时
UML类图:
下面就是装饰模式的代码实现,以人穿衣服为例子:
Component:
public abstract class Person {
abstract void dress();
}
public class Male extends Person{
String name;
public Male(String name) {
this.name = name;
}
@Override
public void dress() {
System.out.println(name+"\r穿内衣内裤");
}
}
Decorator:
public abstract class PersonCloth extends Person{
Person person;
public PersonCloth(Person person){
this.person = person;
}
public void dress(){
person.dress();
}
}
public class CheapCloth extends PersonCloth{
public CheapCloth(Person person) {
super(person);
}
private void dressShirt(){
System.out.println("穿地摊货短袖");
}
private void dressTrousers(){
System.out.println("穿地摊货运动裤");
}
private void dressShoes(){
System.out.println("穿地摊货球鞋");
}
public void dress(){
super.dress();
dressShirt();
dressTrousers();
dressShoes();
}
}
public class ExpensiveCloth extends PersonCloth{
public ExpensiveCloth(Person person) {
super(person);
}
private void dressShirt(){
System.out.println("穿nike短袖");
}
private void dressTrousers(){
System.out.println("穿nike运动裤");
}
private void dressShoes(){
System.out.println("穿nike球鞋");
}
private void dressCap(){
System.out.println("再带一个帽子");
}
public void dress(){
super.dress();
dressShirt();
dressTrousers();
dressShoes();
dressCap();
}
}
Test:
public class Test {
public static void main(String[] args){
Person p = new Male("李雷");
PersonCloth cCloth = new CheapCloth(p);
cCloth.dress();
// PersonCloth eCloth = new ExpensiveCloth(p);
// eCloth.dress();
}
}
总结:参考https://www.kancloud.cn/digest/xing-designpattern/143730