kuk*_*das 14 java oop design-patterns
假设我有以下情况:
public class A {
public String createString(final String value){
if (value == null){
throw new NullPointerException("value must NOT be null.");
}
final StringBuffer sb = new StringBuffer();
sb.append("A");
sb.append("B");
sb.append("C");
if (value.length() > 3){
sb.append("D");
sb.append("E");
}
sb.append("Z");
return sb.toString();
}
}
Run Code Online (Sandbox Code Playgroud)
另一个类应该做类似的任务:
public class B {
public String createString(final String value){
if (value == null){
throw new NullPointerException("value must NOT be null.");
}
final StringBuffer sb = new StringBuffer();
sb.append("A");
sb.append("B");
sb.append("C");
sb.append("Z");
return sb.toString();
}
}
Run Code Online (Sandbox Code Playgroud)
什么是避免重复代码的好策略?到目前为止我想出的是B类具有A的子集功能,因此应该从A类扩展并且相同的任务应该重构为受保护的方法(假设它们在同一个包中).这就是它的样子:
public class A {
public String createString(final String value){
final StringBuffer sb = createTheFirstPart(value);
if (value.length() > 3){
sb.append("D");
sb.append("E");
}
createTheLastPart(sb);
return sb.toString();
}
protected void createTheLastPart(final StringBuffer sb) {
sb.append("Z");
}
protected StringBuffer createTheFirstPart(final String value) {
if (value == null){
throw new NullPointerException("value must NOT be null.");
}
final StringBuffer sb = new StringBuffer();
sb.append("A");
sb.append("B");
sb.append("C");
return sb;
}
}
Run Code Online (Sandbox Code Playgroud)
而B班:
public class B extends A {
public String createString(final String value){
final StringBuffer sb = createTheFirstPart(value);
createTheLastPart(sb);
return sb.toString();
}
}
Run Code Online (Sandbox Code Playgroud)
另一种可能的解决方案是这样的:
public class A {
public String createString(final String value){
if (value == null){
throw new NullPointerException("value must NOT be null.");
}
final StringBuffer sb = new StringBuffer();
sb.append("A");
sb.append("B");
sb.append("C");
addSomeSpecialThings(value, sb);
sb.append("Z");
return sb.toString();
}
protected void addSomeSpecialThings(final String value, final StringBuffer sb) {
if (value.length() > 3){
sb.append("D");
sb.append("E");
}
}
}
Run Code Online (Sandbox Code Playgroud)
和B级:
public class B extends A {
public String createString(final String value){
return super.createString(value);
}
protected void addSomeSpecialThings(final String value, final StringBuffer sb) {
// do nothing
}
}
Run Code Online (Sandbox Code Playgroud)
显然这不是那么好,因为B有空的impl.addSomeSpecialThings.这个例子也很简单.例如,方法中可能存在更多差异,因此提取相同的功能并不容易.
我的解决方案都是关于继承的,也许最好用组合来做这件事.我还认为这可能是战略模式的一个因素.
那么这种问题的最佳方法是什么?在此先感谢您的帮助.
裤裤.
the*_*ejh 11
我会将共享代码放在A和B的超类中:
public abstract class SomeName {
public final String createString(final String value){
if (value == null){
throw new NullPointerException("value must NOT be null.");
}
final StringBuffer sb = new StringBuffer();
sb.append("A");
sb.append("B");
sb.append("C");
addSomeSpecialThings(value, sb);
sb.append("Z");
return sb.toString();
}
protected abstract void addSomeSpecialThings(final String value,
final StringBuffer sb);
}
Run Code Online (Sandbox Code Playgroud)
然后B看起来像这样:
public class B extends SomeName {
protected void addSomeSpecialThings(final String value,
final StringBuffer sb) {}
}
Run Code Online (Sandbox Code Playgroud)
这将是A:
public class A extends SomeName {
protected void addSomeSpecialThings(final String value, final StringBuffer sb) {
if (value.length() > 3){
sb.append("D");
sb.append("E");
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7119 次 |
最近记录: |