装饰器模式下多接口继承的代码冗余问题求助
嘿,这个装饰器模式下的代码冗余问题我之前也遇到过,咱们一步步来拆解解决:
首先得指出你当前设计里的小问题:你的MoveableFigureBaseDecorator本来应该专注于装饰MoveableFigure,结果硬要去实现StaticFigure接口,这就导致你被迫重复实现Static相关方法,完全违反了单一职责原则,冗余自然就来了。
解决方案:拆分装饰器职责 + 分层抽象基类
我们可以重构装饰器的结构,让每个基装饰器只负责对应接口的委托逻辑,然后让需要复合行为的装饰器自行扩展。
第一步:重构基础装饰器结构
先创建一个顶层的通用装饰器基类,负责所有Figure通用方法的委托,再分别为StaticFigure和MoveableFigure创建专属的装饰器基类,各自只处理对应接口的方法:
// 顶层通用接口 interface Figure { // 这里放所有Figure的通用方法(如果有的话) } interface StaticFigure extends Figure { void methodBToBeImplemented(); } interface MoveableFigure extends Figure { void methodAToBeImplemented(); } // 通用装饰器基类:处理Figure通用方法的委托 public abstract class BaseFigureDecorator implements Figure { protected final Figure decoratedFigure; public BaseFigureDecorator(Figure decoratedFigure) { this.decoratedFigure = decoratedFigure; } // 如果Figure有通用方法,在这里统一委托 // 比如: // @Override // public void commonFigureMethod() { // decoratedFigure.commonFigureMethod(); // } } // Moveable专属装饰器基类:只处理MoveableFigure的方法委托 public abstract class MoveableFigureBaseDecorator extends BaseFigureDecorator implements MoveableFigure { protected final MoveableFigure moveableFigure; public MoveableFigureBaseDecorator(MoveableFigure decoratedFigure) { super(decoratedFigure); this.moveableFigure = decoratedFigure; } @Override public void methodAToBeImplemented() { moveableFigure.methodAToBeImplemented(); } } // Static专属装饰器基类:只处理StaticFigure的方法委托 public abstract class StaticFigureBaseDecorator extends BaseFigureDecorator implements StaticFigure { protected final StaticFigure staticFigure; public StaticFigureBaseDecorator(StaticFigure decoratedFigure) { super(decoratedFigure); this.staticFigure = decoratedFigure; } @Override public void methodBToBeImplemented() { staticFigure.methodBToBeImplemented(); } }
第二步:实现复合行为的Cloud装饰器
现在Cloud需要同时具备移动和静态行为,我们只需要让它继承MoveableFigureBaseDecorator(复用移动逻辑的委托),同时实现StaticFigure接口,自行实现静态行为即可:
public class Cloud extends MoveableFigureBaseDecorator implements StaticFigure { public Cloud(MoveableFigure decoratedFigure) { super(decoratedFigure); } // 实现StaticFigure的专属逻辑,完全不需要在基类里重复写了 @Override public void methodBToBeImplemented() { // 这里写Cloud专属的静态行为,比如绘制云朵的静态渲染逻辑 System.out.println("Cloud displays static cloud-like appearance"); // 如果被装饰的对象本身也实现了StaticFigure,还可以灵活委托: // if (decoratedFigure instanceof StaticFigure) { // ((StaticFigure) decoratedFigure).methodBToBeImplemented(); // } } // 可选:重写移动方法,添加Cloud专属的移动效果 @Override public void methodAToBeImplemented() { super.methodAToBeImplemented(); // 复用原有移动逻辑 System.out.println("Cloud moves slowly across the sky"); // 添加云朵专属移动效果 } }
为什么这个方案能解决冗余?
- 每个装饰器基类只负责对应接口的逻辑,遵循单一职责,不会出现跨接口的冗余实现。
- 复合行为的装饰器只需要继承一个基类复用逻辑,再实现另一个接口补充自己的行为,完全避免了重复代码。
- 保留了你原本的需求:部分类只需要单一行为(比如
Dinosaur可以直接继承MoveableFigureBaseDecorator,不需要管Static逻辑)。
内容的提问来源于stack exchange,提问作者voidptr
相关产品推荐
相关产品推荐

