Java设计模式之桥接模式实例详解

2025-05-29 0 58

本文实例讲述了java设计模式桥接模式。分享给大家供大家参考,具体如下:

概念:

桥接模式(bridge pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。

桥接模式将继承关系转换为关联关系,从而降低了类与类之间的耦合,减少了代码编写量。

什么情况下会用桥接模式

简单的说就是我们在抽象对象的特征时,对象的特征属性又很抽象,不得不把属性再次抽象。

否则的话,具体子类的数量将会成几何增长,而且不易扩展。没办法维护现有代码。

举例,我们在抽象手机这二个对象时,它的几个属性,如操作系统,cpu,屏幕,运营商网络等都很复杂。我们不能简单的把这几个属性直接定义,必须再次抽象化。而具体的一个手机对象就是这些属性的组合,但不是简单的组合,属性需要实现自己作为属性的功能。在这样的设计下,代码的维护和扩展也就容易了。

注意:在说这个模式的时候,我不能保证说的和写得例子都是正确的,毕竟我也是新接触到,所有例子均基于与个人理解。

我认为的桥接模式说明图:

Java设计模式之桥接模式实例详解

下面是例子:

1. 首先定义抽象类,抽象和描述对象的特征。

在对象的属性上划分维度,为了以后桥接和扩展。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32
package test.design.bridge;

public abstract class cellphone {

private string cellphonename;

public cellphonesystem cellphonesystem;

public cellphonecpu cellphonecpu;

public void works(){

system.out.println("---------------------");

system.out.println("this cellphone is:"+this.getcellphonename()+",welcome to use. ");

system.out.println("this cellphone detail infomation:");

system.out.println("系统类型:"+this.getcellphonesystem().getsystemname());

system.out.println("cpu型号:"+this.getcellphonecpu().getcpuname());

system.out.println("---------------------");

}

public string getcellphonename() {

return cellphonename;

}

public void setcellphonename(string cellphonename) {

this.cellphonename = cellphonename;

}

public cellphonesystem getcellphonesystem() {

return cellphonesystem;

}

public void setcellphonesystem(cellphonesystem cellphonesystem) {

this.cellphonesystem = cellphonesystem;

}

public cellphonecpu getcellphonecpu() {

return cellphonecpu;

}

public void setcellphonecpu(cellphonecpu cellphonecpu) {

this.cellphonecpu = cellphonecpu;

}

}

2. 属性维度的抽象。(可以使用接口定义,关键看你的具体功能)

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27
package test.design.bridge;

/**

* 属性cpu被抽象成一个维度,为了以后扩展

* @author lushuaiyin

*

*/

public abstract class cellphonecpu {

public cellphone cellphone;

public string cpuname;

public void cpuworks(){

system.out.println("i am cpu. my pattern is:"+this.getcpuname());

system.out.println("i am working for this cellphone:"+this.getcellphone().getcellphonename());

}

public cellphone getcellphone() {

return cellphone;

}

public void setcellphone(cellphone cellphone) {

this.cellphone = cellphone;

this.getcellphone().setcellphonecpu(this);// 装配(桥接,或者可以认为对象类与其属性类的传递)

}

public string getcpuname() {

return cpuname;

}

public void setcpuname(string cpuname) {

this.cpuname = cpuname;

}

}

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27
package test.design.bridge;

/**

* 属性操作系统被抽象成一个维度,为了以后扩展

* @author lushuaiyin

*

*/

public abstract class cellphonesystem {

public cellphone cellphone;

public string systemname;

public void systemworks(){

system.out.println("i am "+this.getsystemname()+" system.");

system.out.println("i am working for this cellphone:"+this.getcellphone().getcellphonename());

}

public cellphone getcellphone() {

return cellphone;

}

public void setcellphone(cellphone cellphone) {

this.cellphone = cellphone;

this.getcellphone().setcellphonesystem(this);// 装配(桥接,或者可以认为对象类与其属性类的传递)

}

public string getsystemname() {

return systemname;

}

public void setsystemname(string systemname) {

systemname = systemname;

}

}

3. 具体的维度属性对象。

这里我们在操作系统属性和cpu属性上各定义2个具体对象,

?

1

2

3
package test.design.bridge;

public class androidsystem extends cellphonesystem{

}

?

1

2

3
package test.design.bridge;

public class iossystem extends cellphonesystem{

}

?

1

2

3

4

5

6

7

8
package test.design.bridge;

/**

* 双核cpu

* @author administrator

*

*/

public class twocore extends cellphonecpu{

}

?

1

2

3

4

5

6

7

8
package test.design.bridge;

/**

* 四核cpu

* @author administrator

*

*/

public class fourcore extends cellphonecpu{

}

4. 测试代码。

其中说了在需要扩展维度的情况下,怎么扩展的。

定义一个手机对象

?

1

2

3

4
package test.design.bridge;

public class phone1 extends cellphone{

//具体对象的属性与逻辑

}

测试main函数

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50
package test.design.bridge;

public class testmain {

/**

* @param args

*/

public static void main(string[] args) {

//任何一种具体的对象都是复杂多种属性的集合,在此可以看出桥接模式在构建对象时的灵活性

//产生一个具体对象1

cellphone p1=new phone1();

p1.setcellphonename(" iphone 6 ");

cellphonesystem system1=new iossystem();//操作系统属性维度

system1.setsystemname("ios7");

system1.setcellphone(p1);//装配

system1.systemworks();//工作

/*装配说的简单点就是传值。因为我们把一个对象的属性按维度分开来了,

那么桥接的时候就必须相互传递对象。即对象类可以调用子属相类对象,

子属性类对象也可以调用该对象类.

关于这样的传值方式有多种,你可以在构造函数中传递,也可以在

调用具体逻辑方法时传递。这里我直接用set方法传递,只是为了更清楚.

如果某个属性维度是必须出现的,那就可以在抽象类的构造函数中传入*/

cellphonecpu cpu1=new twocore();//cpu属性维度

cpu1.setcpuname("a6");

cpu1.setcellphone(p1);

cpu1.cpuworks();

p1.works();//最终整体对象功能

/*

桥接模式就是为了应对属性的扩展,在此说的属性必须是在维度确定的情况下。

比如,这里我们在定义手机对象时,确定两个属性维度:操作系统和cpu型号。

以后再这两个属性中,需要扩展时,就可以使用该模式。比如,一种新的cpu

型号出现了,那么我不用重新设计现在的代码,只要增添一个cpu类即可。

如果出现了新的维度属性,比如手机对象必须考虑屏幕大小。那桥接模式

在此就需要从根本上修改代码来了。

*/

system.out.println("-----------分割---------------------------");

//在cpu维度上扩展。比如出现新型cpu:8核三星exynos 5 octa芯片".

//三星手机推出了galaxy note ⅲ就是使用这种新型cpu. 写一个新类eightcore扩展cpu维度.

//同时定义这个手机对象galaxy note ⅲ为phonegalaxynote3

cellphone note3=new phonegalaxynote3();

note3.setcellphonename("galaxy note ⅲ");

cellphonesystem system2=new androidsystem();

system2.setsystemname("android4");

system2.setcellphone(note3);//装配

system2.systemworks();//工作

cellphonecpu cpu2=new eightcore();//最新8核cpu

cpu2.setcpuname("三星exynos 5 octa芯片");

cpu2.setcellphone(note3);

cpu2.cpuworks();

note3.works();//三星galaxy note ⅲ新体验

}

}

如果需要扩展,定义新的维度属性

?

1

2

3
package test.design.bridge;

public class eightcore extends cellphonecpu {

}

?

1

2

3

4
package test.design.bridge;

public class phonegalaxynote3 extends cellphone{

//具体对象的属性与逻辑

}

测试打印;

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21
i am ios7 system.

i am working for this cellphone: iphone 6

i am cpu. my pattern is:a6

i am working for this cellphone: iphone 6

---------------------

this cellphone is: iphone 6 ,welcome to use.

this cellphone detail infomation:

系统类型:ios7

cpu型号:a6

---------------------

-----------分割---------------------------

i am android4 system.

i am working for this cellphone:galaxy note ⅲ

i am cpu. my pattern is:三星exynos 5 octa芯片

i am working for this cellphone:galaxy note ⅲ

---------------------

this cellphone is:galaxy note ⅲ,welcome to use.

this cellphone detail infomation:

系统类型:android4

cpu型号:三星exynos 5 octa芯片

---------------------

希望本文所述对大家java程序设计有所帮助。

原文链接:http://blog.csdn.net/lushuaiyin/article/details/9345495

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Java设计模式之桥接模式实例详解 https://www.kuaiidc.com/114749.html

相关文章

发表评论
暂无评论