GOF之桥接模式

来源:互联网 发布:黑马程序员学费多少 编辑:程序博客网 时间:2024/06/03 18:30

                      GOF之桥接模式

                      桥接模式的使用


 

 

 

 

 

   桥接模式适合于java中的多重继承关系的处理。一般来说,如果出现二维以上的维度的变化的时候,那么就可以利用桥接模式来进行处理。

那我们什么时候使用桥接模式呢?比如我举一个例子。比如说,一个销售电脑的。销售台式机,笔记本电脑,pad电脑。

而品牌又有lenovo,shenzhou,Dell等。那么这就涉及到了一系列的继承关系了。如果我们使用继承的关系将这些类写出来的话,未免又太麻烦了。这会显得非常的累赘。那么这时候就需要使用到桥接的模式了。其实,如果使用继承

话,为什么会使类之间的继承关系显得很复杂呢?其实原因也是很简单的。因为一个类涉及到了俩方面的内容。比如

联想笔记本电脑。一方面的内容是品牌lenovo,一方面的内容是LanTop笔记本电脑,这就涉及到了二维的内容。用这样

的继承关系来进行处理的话,肯定会变得很复杂的。这是要注意的。

但是如果我们使用了桥接的模式,也就是横轴方向的内容是品牌,比如lenovo,Dell等。纵轴的内容是电脑的类型,比如说是台式电脑,笔记本电脑,和Pad电脑。这样来进行处理的话,那么就明显方便很多了。一个是横轴的内容,而另外一个是纵轴方向的内容。俩方面的内容有交叉的话,那么肯定就可以出来结果了。比如说是lenovo和台式电脑交叉的话,那么就是lenovo台式电脑。

如果我们使用继承的关系来处理这些类的关系的话,那么明显就会显得很累赘了。

package com.bjsxt.bridge;

 

public interface Computer {

void sale();

}

 

class Desktop implements Computer {

@Override

public void sale() {

System.out.println("销售台式机!");

}

}

 

class Laptop implements Computer {

@Override

public void sale() {

System.out.println("销售笔记本!");

}

}

class Pad implements Computer {

@Override

public void sale() {

System.out.println("销售平板电脑!");

}

}

 

class LenovoDesktop extends Desktop {

@Override

public void sale() {

System.out.println("销售联想台式机");

}

}

class LenovoLaptop extends Laptop {

@Override

public void sale() {

System.out.println("销售联想笔记本");

}

}

class LenovoPad extends Pad {

@Override

public void sale() {

System.out.println("销售联想平板电脑");

}

}

 

 

 

class ShenzhouDesktop extends Desktop {

@Override

public void sale() {

System.out.println("销售神舟台式机");

}

}

class ShenzhouLaptop extends Laptop {

@Override

public void sale() {

System.out.println("销售神舟笔记本");

}

}

class ShenzhouPad extends Pad {

@Override

public void sale() {

System.out.println("销售神舟平板电脑");

}

}

 

 

class DellDesktop extends Desktop {

@Override

public void sale() {

System.out.println("销售戴尔台式机");

}

}

class DellLaptop extends Laptop {

@Override

public void sale() {

System.out.println("销售戴尔笔记本");

}

}

class DellPad extends Pad {

@Override

public void sale() {

System.out.println("销售戴尔平板电脑");

}

}

 

 

 

但是如果我们是使用了桥接模式的话,那么明显就显得不一样了。

package com.bjsxt.bridge;

 

/**

 * 品牌。这是其中的一个维度。

 * 如果我们想要增加品牌的话,那么

 * 我们直接在这个类中增加就可以了。

 * 和另外一个维度,也就是电脑的类型

 * 是无关的。这就大大降低了类的复杂关系。

 * @author Administrator

 *

 */

public interface Brand {

void sale();

}

 

class Lenovo implements Brand {

 

@Override

public void sale() {

System.out.println("销售联想电脑");

}

}

 

class Dell implements Brand {

@Override

public void sale() {

System.out.println("销售Dell电脑");

}

}

 

class Shenzhou implements Brand {

@Override

public void sale() {

System.out.println("销售神舟电脑");

}

}

 

 

package com.bjsxt.bridge;

 

/**

 * 电脑类型的维度。这也是一个独立的维度

 * 如果我们需要增加电脑的类型的话,那么

 * 我们直接在这个类中进行增加就可以了。

 * 和另外一个维度的内容是无关的。

 * @author Administrator

 *

 */

public class Computer2 {

/*这里通过组合的方式,来得到

  电脑品牌的引用*/

protected Brand brand;

public Computer2(Brand b) {

this.brand = b;

}

public void sale(){

brand.sale();

}

}

 

class Desktop2 extends Computer2 {

 

public Desktop2(Brand b) {

super(b);

}

@Override

public void sale() {

super.sale();

System.out.println("销售台式机");

}

}

 

class Laptop2 extends Computer2 {

public Laptop2(Brand b) {

super(b);

}

@Override

public void sale() {

super.sale();

System.out.println("销售笔记本");

}

}

 

 

 

package com.bjsxt.bridge;

 

public class Client {

public static void main(String[] args) {

//销售联想的笔记本电脑

Computer2  c = new Laptop2(new Lenovo());

c.sale();

//销售神舟的台式机

Computer2 c2 = new Desktop2(new Shenzhou());

c2.sale();

}

}

 

 

0 0
原创粉丝点击