1、装饰者模式的定义
装饰者模式是在已有功能的基础之上,动态地添加更多功能的一种方式,这些新加的代码装饰了原有类的核心职责或主要行为。
IO阻塞类中有该使用该场景,动态给一个对象添加一些额外的功能。
2、装饰者模式的优缺点
优点:把类的 核心职责和装饰功能区分开来,结构清晰,可以去除相关类的重复的装饰逻辑,相比用生成子类方式达到功能的扩充显得更为灵活。
缺点:产生了太多的装饰者类,有类爆炸的趋势。
3、如何实现装饰者模式
要点:装饰者与被装饰者拥有共同的超类。
//懒,就写一起了
public class MainTest {
//测试方法
public static void main(String[] args) throws Exception {
People man = new Man();
Decorator decoratorMan = new DecoratorMan(man);
//定义一个真男人
Decorator decoratorXMan = new DecoratorXMan(decoratorMan);
decoratorXMan.drinking();
decoratorXMan.driving();
// **********找到啤酒一箱**********
// **********喝酒**********
// **********喝一箱**********
// **********找到驴车一辆**********
// **********开车**********
// **********往城市边缘瞎JB开**********
}
//定义被装饰者
public interface People {
//喝酒
void drinking();
//开车
void driving();
}
//定义被装饰者,被装饰者初始状态有些自己的装饰
public static class Man implements People {
@Override
public void drinking() {
System.out.println("**********喝酒**********");
}
@Override
public void driving() {
System.out.println("**********开车**********");
}
}
//定义装饰者
public abstract static class Decorator implements People {
private People people;
public Decorator(People people) {
this.people = people;
}
//喝酒
public void drinking() {
people.drinking();
}
//开车
public void driving() {
people.driving();
}
}
//男人 喝啤酒开驴车
public static class DecoratorMan extends Decorator{
public DecoratorMan(People people) {
super(people);
}
public void lookingForWine(){
System.out.println("**********找到啤酒一箱**********");
}
public void lookingForCar(){
System.out.println("**********找到驴车一辆**********");
}
//喝酒
public void drinking() {
lookingForWine();
super.drinking();
}
//开车
public void driving() {
lookingForCar();
super.driving();
}
}
//真男人 往城市边缘瞎XX开
public static class DecoratorXMan extends Decorator{
public DecoratorXMan(People people) {
super(people);
}
public void howMuch(){
System.out.println("**********喝一箱**********");
}
public void where(){
System.out.println("**********往城市边缘瞎JB开**********");
}
//喝酒
public void drinking() {
super.drinking();
howMuch();
}
//开车
public void driving() {
super.driving();
where();
}
}
}
网友评论