桥接模式的英文是 Bridge ,桥接模式关注抽象的设计。抽象是指包含了一组抽象方法的类,这些抽象方法可能包含多个实现。
实现抽象的一般做法是创建类的层次结构,该层次结构的顶部是一个包含抽象方法的抽象类,该类的每一个子类都提供这些抽象方法的不同实现。但是,当需要对该层次进行子类化时,这一做法就存在不足了。
你可以创建一个桥,然后把这些抽象方法移到接口中,这样,抽象就依赖于接口的实现。
桥接模式的意图是:将抽象与抽象方法的实现相互分离来实现解耦,以便二者可以相互独立的变化。
上面这段话的意思就是说实现与抽象相分离。
下面举个例子说明:
1.现在水果里有 苹果和橘子
2.人分为 男人和女人
3.人都可以吃水果,所以有 2*2 = 4 中情况
如果我们不用桥接模式,那么实现这么多情况就需要一个一个的去实现,也就是4类,那么我们使用桥接模式呢?答案是:2类。这在条件和实现比较多的情况下优势会更明显。
具体的实现:
下面首先给出实现的UML图
实现的代码和说明如下:
1.Fruit类
package com.brucezhang.bridge; public abstract class Fruit { /** * 抽象方法 * @param People * */ public abstract void eatFruit(People people); }
2.Apple类
package com.brucezhang.bridge; public class Apple extends Fruit{ @Override public void eatFruit(People people) { // TODO Auto-generated method stub System.out.println(people.getType() + " eat apple !"); } }
package com.brucezhang.bridge; public class Oranger extends Fruit{ @Override public void eatFruit(People people) { // TODO Auto-generated method stub System.out.println(people.getType() + " eat oranger !"); } }
4.People类
package com.brucezhang.bridge; public abstract class People { private String type; private Fruit fruit; public String getType() { return type; } public void setType(String type) { this.type = type; } public Fruit getFruit() { return fruit; } public void setFruit(Fruit fruit) { this.fruit = fruit; } //抽象方法 public abstract void eat(); }
5.Man类
package com.brucezhang.bridge; public class Man extends People{ public Man(){ setType("Man"); } @Override public void eat() { // TODO Auto-generated method stub getFruit().eatFruit(this); } }
package com.brucezhang.bridge; public class Woman extends People{ public Woman(){ setType("Woman"); } @Override public void eat() { // TODO Auto-generated method stub getFruit().eatFruit(this); } }
7.测试类--Main_Test
package com.brucezhang.bridge; public class Main_Test { public static void main(String[] args) { People man = new Man(); People woman = new Woman(); Fruit apple = new Apple(); Fruit oranger = new Oranger(); apple.eatFruit(man); oranger.eatFruit(woman); apple.eatFruit(woman); oranger.eatFruit(man); } }
程序执行的结果如下:
Man eat apple ! Woman eat oranger ! Woman eat apple ! Man eat oranger !