装饰者模式
装饰者模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。
简单来说,就是动态地给一个对象添加一些额外的功能
Java的IO大量采用该模式
代理模式和装饰者模式的区别是:代理模式倾向于访问的控制,装饰模式倾向于功能的增强
主要解决:
一般的,为了扩展一个类经常使用继承方式实现。随着扩展功能的增多,子类会很膨胀
何时使用:
想扩展类,但又不想增加很多子类的情况下
实现步骤:
- 装饰者和被装饰者实现共同的接口
- 装饰者内部保存被装饰者的对象
- 创建装饰者的时候传入被装饰者对象
- 调用装饰者方法时,会调用被装饰者方法,同时进行增强
举例:
基础功能的接口:
/**
* 战斗接口
*/
public interface Fight {
void attack();
void move();
}
被装饰类:
/**
* 普通人
*/
public class Man implements Fight{
@Override
public void attack() {
System.out.println("普通人用小拳拳捶你胸口!");
}
@Override
public void move() {
System.out.println("普通人在地上跑啊跑!");
}
}
装饰类:
/**
* 钢铁战衣
*/
public class ManDecorator implements Fight{
//普通人对象
private Fight man = null;
//创建时传入被装饰对象
public ManDecorator(Fight man) {
this.man = man;
}
@Override
public void attack() {
//调用被装饰对象的方法
this.man.attack();
//增强
System.out.println("钢铁战衣发射激光炮!!!");
}
@Override
public void move() {
this.man.move();
System.out.println("钢铁战衣起飞了!!");
}
}
测试:
public class TestManDecorator {
public static void main(String[] args) {
//被装饰对象
Fight man = new Man();
man.attack();
man.move();
//穿战衣
Fight fight = new ManDecorator(man);
fight.attack();
fight.move();
}
}