仅单个类变量存在差异的两个类适用何种设计模式?
针对你的类重复问题,这两个设计方案更合适!
嘿,这个场景太典型啦!你看A和B两个类除了str的初始值不一样,其他逻辑完全一致,用继承当然可以,但其实有更简洁的方式来避免代码重复,下面给你推荐两种最贴合的方案:
方案1:继承+父类封装通用逻辑(贴合你原本的思路)
你可以先定义一个父类,把通用的method()方法放在父类里,把差异化的str作为可配置属性,子类只需要通过构造方法传入不同的str值就行,完美消除重复代码:
// 父类封装所有通用逻辑 abstract class BaseClass { protected String str; // 通过构造方法传入差异化的字符串 protected BaseClass(String str) { this.str = str; } // 通用的方法只写一次 void method() { System.out.print(str); } } // 子类只负责传入自己的专属字符串,不用重复写method class A extends BaseClass { public A() { super("A"); } } class B extends BaseClass { public B() { super("B"); } }
以后如果要修改method()的逻辑(比如改成打印字符串加换行),只需要改父类就行,不用同时改A和B,维护起来超方便。
方案2:策略模式(更轻量,适合不需要子类的场景)
如果你的场景里不需要专门创建A、B这类子类,只是需要不同的打印行为,策略模式会更灵活。把差异化的打印逻辑抽成策略接口,核心执行类依赖这个接口,使用时直接传入不同的策略即可:
// 定义打印策略接口 interface PrintStrategy { void print(); } // 通用的执行类,只负责调用策略 class Printer { private PrintStrategy strategy; public Printer(PrintStrategy strategy) { this.strategy = strategy; } void execute() { strategy.print(); } } // 使用的时候直接传入不同的策略,甚至用lambda简化 public class Main { public static void main(String[] args) { Printer printerA = new Printer(() -> System.out.print("A")); Printer printerB = new Printer(() -> System.out.print("B")); printerA.execute(); // 输出A printerB.execute(); // 输出B } }
这种方式不用创建一堆子类,以后要加新的打印内容,直接传个新的lambda就行,非常轻量灵活。
小总结
原来的写法重复了method()的逻辑,违反了DRY(Don't Repeat Yourself)原则,上面两种方案都能解决这个问题:如果你偏爱继承的思路,选方案1;如果想要更灵活的配置,选方案2就好~
内容的提问来源于stack exchange,提问作者minotna
相关产品推荐
相关产品推荐

