设计模式笔记之七 (桥接模式)
桥接模式
桥接模式就是把影响事物对象的多个因素抽象出来从而使两者解偶,那么就能动态的加载变化的因素。
好吧,这个定义很抽象,我们还是来聊下具体的事物。
最近我们实验室因为一系列的设计模式改进,所以竞争力和盈利都有了长足的发展,所以老总们就计划着冲出亚洲,走向全球了。但是我们以前生产的男人女人都是黑发黄肤的东方系列产品,现在要打入欧美市场,我们就必须要生产金发白肤的西方系列产品,所以我们就定制了各自的产品模板:
class Ren { } class NanRen extends Ren { public String gender = "男"; public String hair = ""; public String skin = ""; } class NvRen extends Ren { public String gender = "女"; } class DongFangNanRen extends NanRen { public String hair = "黑色"; public String skin = "黄肤"; public void build() { System.out.println("性别:" + gender + ", 特征:" + hair + ", " + skin); } } class XiFangNanRen extends NanRen { public String hair = "金色"; public String skin = "白肤"; public void build() { System.out.println("性别:" + gender + ", 特征:" + hair + ", " + skin); } } class DongFangNvRen extends NvRen { public String hair = "黑色"; public String skin = "黄肤"; public void build() { System.out.println("性别:" + gender + ", 特征:" + hair + ", " + skin); } } class XiFangNvRen extends NvRen { public String hair = "金色"; public String skin = "白肤"; public void build() { System.out.println("性别:" + gender + ", 特征:" + hair + ", " + skin); } } public class Bridge { public static void main(String[] args) { new XiFangNvRen().build(); new DongFangNvRen().build(); new XiFangNanRen().build(); new DongFangNanRen().build(); } }
这时人妖工厂的厂长说人妖也要打入欧美市场,正常人工厂的厂长说我们不仅仅要打入欧美市场,还得打入非洲和印度市场。
我们的模具制造哥一听立马晕倒,倒地前大吼一句,要3X4个模具让哥加班加死吧。
就在这时,我们的资深顾问提出了一种解决方案来解救模具制造哥:
既然我们的"人"产品需要一些头发和皮肤的"特征",而头发和皮肤的特征会不时的改变,我们何不将"人"和"特征"分离开来,"人"只需要知道自己要有一些"特征",至于"特征"是什么样的,到用户使用的时候用户给"人"赋予自己所需要的"特征"就行。
class Ren { TeZhen tz; public void setTeZhen(TeZhen tz) { this.tz = tz; } } class NanRen extends Ren { public String gender = "男"; public void build() { System.out.println("性别:" + gender + ", 特征:" + tz.getHair() + ", " + tz.getSkin()); } } class NvRen extends Ren { public String gender = "女"; public void build() { System.out.println("性别:" + gender + ", 特征:" + tz.getHair() + ", " + tz.getSkin()); } } interface TeZhen { public abstract String getHair(); public abstract String getSkin(); } class DongFangTeZhen implements TeZhen { @Override public String getHair() { return "黑色"; } @Override public String getSkin() { return "黄肤"; } } class XiFangTeZhen implements TeZhen { @Override public String getHair() { return "金色"; } @Override public String getSkin() { return "白肤"; } } public class Bridge { public static void main(String[] args) { NvRen nvren = new NvRen(); //创建一个女人 TeZhen df = new DongFangTeZhen();// 生产一个东方特征 nvren.setTeZhen(df); // 将东方特征赋予一个女人 nvren.build(); // 这就是我们需要的东方女人 TeZhen xf = new XiFangTeZhen(); nvren.setTeZhen(xf);//我们还可以给同一个人换上西方特征来满足我们一些特殊的需求 nvren.build(); } }
这样设计就解决了我们模具制造哥的问题,不过也让我们的模具制造哥失业了,因为进入非洲及印度市场的时候,我们只需要加上两种特征就行了。
class FezhouTeZhen implements TeZhen { @Override public String getHair() { return "黑色"; } @Override public String getSkin() { return "黑肤"; } } class YingDuTeZhen implements TeZhen { @Override public String getHair() { return "黑色"; } @Override public String getSkin() { return "棕肤"; } }
现在全球都是我们的市场,并且很多人买了一个"人"和多个"特征"来满足不同时间段的需要。