大家好鸭,我系洪爵。今天又是设计模式的一天。
洪爵想给大家讲一下桥接模式!桥接模式,通往世界的任何一个角落都必备的桥梁!
桥接模式属于结构型模式,结构型模式旨在关注类与对象的组合。
那么桥接模式能干什么呢?我们先来看一个场景:
这世界上有很多种语言:中文、俄罗斯语、德语……等等,我们抽象出一个语言类,然后让中文、俄罗斯语等去继承这个语言类进行拓展。这个时候,要具体到某人去说这个语言了,这里有两种解决方案,一种是通过继承的方式去实现:
我们会发现当需要具体到某一个人去说语言,就会产生很多类,这个时候我再添加一门语言,就需要增加4个类:某语言类,学生讲某语言类、老师讲某语言类和工人讲某语言类;同时的会多出4个继承关系,某语言继承语言类,学生讲某语言类、老师讲某语言类和工人讲某语言类继承某语言类。这无疑加大系统中类的数量,后续难以维护。
我们再看方案二,方案二通过组合的方式去减少系统中类的个数,便于系统的拓展和后续的维护,通过桥梁架起类和组合的关系,当增加一个语言或者增加一个述说者都不会影响到对方,因为语言都继承自语言类,述说的人都实现了述说者接口。
我们现在要新增一个语言类,那么就只需要添加1一个类,多一个继承关系;多一个述说者也是同样如此,而我们只需要把语言和述说者组合起来就可以了。
有多个维度的变化时候(语言和述说者),抽象与实现分开来,使它们可以独立的变化,减少了类的个数,这种模式我们称之为桥接模式。
上代码加深印象:
// Language.java
public abstract class Language {
Speaker speaker;
public void setSpeaker(Speaker speaker) {
this.speaker = speaker;
}
public abstract void speak();
}
// Speaker.java
public interface Speaker {
void talking(String language);
}
// Chinese.java
public class Chinese extends Language {
public void speak() {
this.speaker.talking("Chinese");
}
}
// English.java
public class English extends Language {
public void speak() {
this.speaker.talking("English");
}
}
// Engineer.java
public class Engineer implements Speaker {
public void talking(String language) {
System.out.println("Engineer is talking in " + language);
}
}
// Manager.java
public class Manager implements Speaker {
public void talking(String language) {
System.out.println("Manager is talking in " + language);
}
}
// Worker.java
public class Worker implements Speaker {
public void talking(String language) {
System.out.println("Worker is talking in " + language);
}
}
// Client.java
public class Client {
public static void main(String[] args) {
Language chinese = new Chinese();
Language english = new English();
Speaker worker = new Worker();
Speaker engineer = new Engineer();
Manager manager = new Manager();
chinese.setSpeaker(manager);
chinese.speak();
chinese.setSpeaker(worker);
chinese.speak();
english.setSpeaker(engineer);
english.speak();
}
}
/*
Manager is talking in Chinese
Worker is talking in Chinese
Engineer is talking in English
*/
本章桥接模式就到这里啦!希望对你有所帮助~
愿每个人都能带着怀疑的态度去阅读文章并探究其中原理。
道阻且长,往事作序,来日为章。
期待我们下一次相遇!