装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例
装饰器模式的应用场景
-
需要扩展一个类的功能。
-
动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删)
缺点:产生过多相似的对象,不易排错!
代码案例:实现一个做菜的功能,但是做菜前先买菜
接口:IFood(食物接口)
目标类:Fish(做条鱼)
装饰类:FishDecorate,需要持有一个目标类的引用
测试类
/**
* 接口类
* @author zhouzhongyi
*
*/
public interface IFood{
void doFood();
}
/**
* 目标类
* @author zhouzhongyi
*
*/
public class Fish implements IFood {
@Override
public void doFood() {
System.out.println("做条鱼来吃");
}
}
/**
* 装饰类
*
* 1:装饰类,需要去实现被装饰类接口
* 2:装饰类的本质是对已有的类进行功能增强
*
* @author zhouzhongyi
*
*/
public class FishDecorate implements IFood{
//被装饰的类的实例,该实例由外部传入
private Fish fish;
//通过构造方法传入被装饰类的实例
public FishDecorate(Fish fish){
this.fish= fish;
}
//对被装饰类的做菜功能进行装饰,使其功能增强
@Override
public void doFood() {
System.out.println("做鱼之前先买条鱼");
//依然使用的是被装饰类的做鱼
fish.doFood();
}
}