Decorator:
动态(组合)地给一个对象添加一些额外的职责,就增加功能来说,Decorator模式相比生成子类更为灵活(继承)
① 创建Component组件(Human)
/**
* 抽象类,人类
*/
public abstract class Human {
// 跑
abstract void run();
}
② 创建具体对象ConcreteComponent(Man和Woman)
public class Man extends Human {
@Override
void run() {
System.out.println("Man没穿衣服在跑");
}
}
public class Woman extends Human {
@Override
void run() {
System.out.println("Woman没穿衣服在跑");
}
}
③ 创建Decorator(HumanDecorator)中间件
/**
* 同时继承+组合(Decorator)
*/
public class HumanDecorator extends Human {
// 组合,将来支持实现(woman/man/?)
private Human decoratorHuman;
public HumanDecorator(Human decoratorHuman){
this.decoratorHuman = decoratorHuman;
}
@Override
void run() {
/**
* 实现类在调用是,是在运行期间确定Huam传入的对象
* 来判断是man或者woman执行run
*/
decoratorHuman.run();
}
④ 创建 具体类ConcreteDecorator(DressTousers和DressJacket)
public class DressTrousers extends HumanDecorator {
// 运行时,根据创建的man/woman选择子对象
public DressTrousers(Human decoratorHuman) {
super(decoratorHuman);
}
//
public void runDecorator(){
super.run();
System.out.println("穿条裤子");
}
}
public class DressJacket extends HumanDecorator {
public DressJacket(Human decoratorHuman) {
super(decoratorHuman);
}
//
public void runDecorator(){
super.run();
System.out.println("穿条上衣");
}
}
⑤ 测试(这里的话举例Man对象,用DressJack(穿上衣)进行修饰)
public class Test {
public static void main(String[] args) {
// 创建man
Man man = new Man();
System.out.println("正常:");
man.run();
System.out.println("---------------");
DressJacket dressJacket = new DressJacket(man);
System.out.println("装饰者调用,不添加职责:");
dressJacket.run();
System.out.println("---------------");
System.out.println("装饰者调用,添加职责:");
dressJacket.runDecorator();
System.out.println("---------------");
}
}
结果:
正常:
Man没穿衣服在跑
---------------
装饰者调用,不添加职责:
Man没穿衣服在跑
---------------
装饰者调用,添加职责:
Man没穿衣服在跑
穿条上衣
优点:若需要对man添加更多的职责,使用Decorator只需要对Decorator进行扩展。如果用继承的话,需要进行多次继承,增加 大量新的类。在装饰类越多的情况下越明显。
组件可以自由组合,从简单到困难,即在需要的时候定义(实现特殊的功能,而不是复杂的特征)。
缺点:使用装饰时不应该依赖对象标识
有许多小对象,容易定制但很难排错