1. 耦合和内聚Couple & cohesion
stackoverflow上有关于该问题的Q&A.
Coupling-耦合:对于一个系统,如果改变一个单元时必须改变另一个单元的情形,我们称之为耦合。
Cohesion-内聚:测试一个单元是否时内聚的标准是,该单元是否完成一个独立的有意义的功能。
高内聚合低耦合是好的设计的标准。
2. Decoupling解耦合
- 继承方式:当修改时只需作用于扩展类,不必每个都做改动。
package com.fqyuan.thinking;
import java.util.ArrayList;
import java.util.Arrays;
abstract class Processor {
public String name() {
return this.getClass().getSimpleName();
}
public abstract Object process(Object input);
}
class Uppercase extends Processor {
@Override
public Object process(Object input) {
return ((String) input).toUpperCase();
}
}
class Lowercase extends Processor {
@Override
public Object process(Object input) {
return ((String) input).toLowerCase();
}
}
class Splitcase extends Processor {
@Override
public Object process(Object input) {
return Arrays.toString(((String) input).split(" "));
}
}
class ExtendUtil {
public static void test(Processor p, Object s) {
System.out.println("Using processor " + p.name());
System.out.println((String) (p.process(s)));
}
}
public class ExtendDecouple {
public static void main(String[] args) {
String str = "Valar Morghulis, Valar Dohaeris";
ArrayList<Processor> list = new ArrayList<>();
list.add(new Uppercase());
list.add(new Lowercase());
list.add(new Splitcase());
for (Processor p : list)
ExtendUtil.test(p, str);
}
}
//Running result:
Using processor Uppercase
VALAR MORGHULIS, VALAR DOHAERIS
Using processor Lowercase
valar morghulis, valar dohaeris
Using processor Splitcase
[Valar, Morghulis,, Valar, Dohaeris]
- 实现方式:类似,语法机制不同。
package com.fqyuan.thinking;
import java.util.ArrayList;
import java.util.Arrays;
interface Processor1 {
String name();
Object process(Object input);
}
class UpperImpl implements Processor1 {
@Override
public String name() {
return this.getClass().getSimpleName();
}
@Override
public Object process(Object input) {
return ((String) input).toUpperCase();
}
}
class LowerImpl implements Processor1 {
@Override
public String name() {
return this.getClass().getSimpleName();
}
@Override
public Object process(Object input) {
return ((String) input).toLowerCase();
}
}
class SplitImpl implements Processor1 {
@Override
public String name() {
return this.getClass().getSimpleName();
}
@Override
public Object process(Object input) {
return Arrays.toString(((String) input).split(" "));
}
}
class ImplUtil {
public static void test(Processor1 p, Object s) {
System.out.println(p.name());
System.out.println(p.process(s));
}
}
public class ImplementDecouple {
public static void main(String[] args) {
String str = "Valar Morghulis, Valar Dohaeris";
ArrayList<Processor1> list = new ArrayList<>();
list.add(new UpperImpl());
list.add(new LowerImpl());
list.add(new SplitImpl());
for (Processor1 p : list)
ImplUtil.test(p, str);
}
}
//Running result:
UpperImpl
VALAR MORGHULIS, VALAR DOHAERIS
LowerImpl
valar morghulis, valar dohaeris
SplitImpl
[Valar, Morghulis,, Valar, Dohaeris]