使用场景:
给某个对象的功能进行扩展时,可以考虑使用装饰者设计模式。
在IO流这部分内容中,JDK的源码使用了大量的装饰者设计模式。比如BufferedReader可以对FileReader进行装饰。
以去拉面馆吃拉面为例,一碗面做好后都会向里面加料装饰,所以先定义一个装饰拉面的接口,提供一个加料的方法
/**
* 装饰拉面
*
*/
public interface NoodleDecorate {
//向拉面中加料
void addThings();
}
创建一个拉面(Noodle)类实现NoodleDecorate接口
/**
* 普通拉面
*
*/
public class Noodle implements NoodleDecorate {
//普通拉面做好后,会向里面添加一些东西
@Override
public void addThings() {
System.out.println("加两片肉末");
System.out.println("加一片萝卜");
System.out.println("加三根香菜");
}
}
普通的拉面做好之后,有人爱吃辣椒,想在拉面中添加辣椒,创建一个辣椒拉面(ChiliNoodle)类
/**
* 拉面加辣椒
*
*/
public class ChiliNoodle implements NoodleDecorate {
//普通拉面
private Noodle noodle;
/**
* 将普通拉面对象传入
* @param noodle
*/
public ChiliNoodle(Noodle noodle) {
this.noodle = noodle;
}
/**
* 对普通拉面进行升级
*/
@Override
public void addThings() {
//普通拉面
noodle.addThings();
//在普通拉面中添加辣椒
System.out.println("加三勺辣椒");
}
}
Demo
public class NoodleTest {
public static void main(String[] args) {
Noodle noodle = new Noodle();
//noodle.addThings();
ChiliNoodle cn = new ChiliNoodle(noodle);
cn.addThings();
}
}
装饰者设计模式的优点:
不用修改被装饰对象的源码,装饰者与被装饰者耦合度不高。
评论区