Bridge 模式之前看过,看到最后发现这就是一个继承嘛,竟然还能搞个模式出来,不科学啊,当时没弄清楚,后来就没关注了;今天忽然热血来潮,决定搞清楚这个模式,仔细研究后发现之前我被坑了。html
好多博主写过 bridge 模式,很多写的都有问题,有些是核心思想写对了,可是举例写错了;有些画了一堆图把人绕晕了,最后彻底看不懂。
固然还有一个缘由是平时用的少,不多人去研究,写博客纯粹就是抄别人的,别人错他也错,而后看的人似是而非,糊里糊涂。java
核心:解耦对象描述,让对象能够单独变化。web
这里举个栗子:
若是 “中国人写中文小说” 是一个java类;那么 “美国人写英文小说”、“中国人写英文小说”、“美国人写中文小说” 是否是都须要分别建立一个类;若是日本人、阿拉伯人、埃及人等等写古埃及语、日语等等的小说,这些是否是都须要分别建立类,这样类是否是太多了?
咱们冷静一下,不管中国人、美国人、埃及人,他们都属于人,是否是能够抽象出一我的的类?中文小说、英文小说、日语小说都属于小说,是否是能够抽象出一个小说的类?设计模式
这样的话小说的继承类(中文小说、英文小说…)和人的继承类(中国人、美国人…)是否是就能够解耦后分别进行变化。ide
声明小说类 Novelsvg
public abstract class Novel { public void language() { } }
Novel 的两个继承类测试
public class EnglishNovel extends Novel { @Override public void language() { System.out.println("英文小说"); } } public class ChineseNovel extends Novel { @Override public void language() { System.out.println("中文小说"); } }
声明人类 Person,里面要包含相关类(Novel类)this
public abstract class Person { public Novel novel; public Person(Novel novel) { this.novel = novel; } //人类写小说的动做方法 abstract void write(); }
Person 的两个继承类设计
//中国人 public class Chinese extends Person { public Chinese(Novel novel) { super(novel); } @Override public void write() { System.out.print("中国人写"); novel.language(); } } //美国人 public class American extends Person { public American(Novel novel) { super(novel); } @Override public void write() { System.out.print("美国人写"); novel.language(); } }
测试类code
public class Main { public static void main(String[] args) { Person person = new Chinese(new EnglishNovel()); person.write(); } }
测试打印:
中国人写英文小说
看图仍是颇有必要的,可是我真不喜欢画图,因此找了下面这个供参考