假想需求
有白人 黑人 有说英语的白人 有说汉语的白人 有说汉语的黑人 有说英语的黑人
按照一般的方法 子类 父类 可以造出4个子类来 这还是2*2的组合 假如分支多了就是N*N了
解决
桥接模式
分出其中一种稳定的类型分支用继承体系来区分 另一种行为分支用接口封装行为(策略模式?)
接下来看代码
抽象人
public abstract class People {
protected Language language;
abstract void speak();
}
黑人
public class BlackPeople extends People {
/**
*
*/
public BlackPeople() {
}
public BlackPeople(Language language){
this.language=language;
}
@Override
void speak() {
System.out.println("I'm black");
language.speak();
}
}
白人
public class WhitePeople extends People {
/**
*
*/
public WhitePeople() {
}
public WhitePeople(Language language){
this.language=language;
}
@Override
void speak() {
System.out.println("I'm white");
language.speak();
}
}
行为抽象类
public interface Language {
void speak();
}
汉语
public class Chinese implements Language {
public void speak() {
System.out.println("你好 世界");
}
}
英语
public class English implements Language {
public void speak() {
System.out.println("hello world");
}
}
测试类
public class Client extends TestCase {
public void test1() {
People black=new BlackPeople(new Chinese());
black.speak();
People black2=new BlackPeople(new English());
black2.speak();
System.out.println("=============");
People white=new WhitePeople(new Chinese());
white.speak();
People white2=new WhitePeople(new English());
white2.speak();
}
}
输出
I'm black
你好 世界
I'm black
hello world
=============
I'm white
你好 世界
I'm white
hello world
这样使用模式后 极大的减少了代码 虽然现在有6个类 但是这是 1+1+2+2
假如按照原来的分法 有N*N个分支 使用模式后 会有1+1+N+N 而不是N*N个类
代码少了 出错的几率就少了 改需求的时候改的地方也少了 更重要的是 没有了重复的代码片段