一、传统方式
1、需求分析
现在对不同手机类型的不同品牌实现操作编程(比如:开机、关机,上网,打电话等)
2、传统方式解决手机操作问题:
传统方式解决手机使用问题(类图)
3、传统方式解决手机操作问题分析
(1)扩展性问题(类爆炸),如过再增加手机的样式(旋转式),就需要增加各个品牌手机的类,同样如果增加一个手机品牌,也要在各个手机样式类下增加;
(2)违反了单一职责原则,当增加手机样式时,也要同时增加所有品牌的手机,这样增加了代码维护成本
二、桥接模式(Bridge Pattern)——基本介绍
1、基本介绍
(1)桥接模式(Bridge模式)是指:将 实现 与 抽象 放在两个不同的类层次中,使两个层次可以独立改变;
(2)桥接模式是一种结构型设计模式;
(3)Bridge 模式基于 类的最小设计原则,通过使用封装、聚合及集成等行为让不同的类承担不同的职责。
它的主要特点是把 抽象(Abstraction)与 行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及对他们的功能扩展;
2、桥接模式:原理类图
(1)Client类:桥接模式的调用者;
(2)抽象类(Abstraction):维护了 Implementor /即它的实现类 ConcreteImplementorA..., 二者是聚合关系,Abstraction 充电桥接类;
(3)RefinedAbstraction:是 Abstraction 抽象类的子类;
(4)Implementor:行为实现类的接口;
(5)ConcreteImplementorA/B :行为的具体实现类;
(6)从 UML 图:这里的抽象类和 接口是聚合的关系,其实 调用 和 被调用关系;
三、桥接模式实现需求
1、桥接模式解决手机操作问题
使用桥接模式改进传统方式,让程序须有更好的扩展性,利用程序维护
(1)应用实例与前面一样;
(2)使用桥接模式对应的类图
2、代码实现
接口端(实现端):定义行为
1 /**
2 * 接口
3 */
4 public interface Brand {
5
6 void open();
7 void close();
8 void call();
9 }
10
11 --------------------------------
12 public class Xiaomi implements Brand {
13
14 @Override
15 public void open() {
16 System.out.println("小米手机开机");
17 }
18
19 @Override
20 public void close() {
21 System.out.println("小米手机关机");
22 }
23
24 @Override
25 public void call() {
26 System.out.println("小米手机打电话");
27 }
28 }
29 --------------------------------
30 public class Vivo implements Brand{
31 @Override
32 public void open() {
33 System.out.println("Vivo手机开机");
34 }
35
36 @Override
37 public void close() {
38 System.out.println("Vivo手机关机");
39 }
40
41 @Override
42 public void call() {
43 System.out.println("Vivo手机打电话");
44 }
45 }
抽象端(抽象类端):
1 public abstract class Phone {
2
3 //组合品牌
4 private Brand brand;
5
6 //构造器
7 public Phone(Brand brand) {
8 super();
9 this.brand = brand;
10 }
11 public Phone() {
12 super();
13 }
14
15 protected void open() {
16 this.brand.open();
17 }
18
19 protected void close() {
20 this.brand.close();
21 }
22
23 protected void call() {
24 this.brand.call();
25 }
26 }
27 -----------------------------------------
28 public class FoldedPhone extends Phone{
29
30 public FoldedPhone(Brand brand) {
31 super(brand);
32 }
33
34 @Override
35 public void open() {
36 super.open();
37 System.out.println("折叠样式手机");
38 }
39
40
41 @Override
42 public void close() {
43 super.close();
44 System.out.println("折叠样式手机");
45 }
46
47
48 @Override
49 public void call() {
50 super.call();
51 System.out.println("折叠样式手机");
52 }
53 }
54 -----------------------------------------
55 public class UpRighPhone extends Phone {
56
57 public UpRighPhone(Brand brand) {
58 super(brand);
59 }
60
61 @Override
62 public void open() {
63 super.open();
64 System.out.println("直立样式手机");
65 }
66
67
68 @Override
69 public void close() {
70 super.close();
71 System.out.println("直立样式手机");
72 }
73
74
75 @Override
76 public void call() {
77 super.call();
78 System.out.println("直立样式手机");
79 }
80 }
客户端:
1 public class Client {
2
3 public static void main(String[] args) {
4 FoldedPhone foldedPhone = new FoldedPhone(new Xiaomi());
5 foldedPhone.open();
6 foldedPhone.close();
7 foldedPhone.call();
8
9 System.out.println("-----------------------");
10 FoldedPhone foldedPhone1 = new FoldedPhone(new Vivo());
11 foldedPhone1.open();
12 foldedPhone1.close();
13 foldedPhone1.call();
14
15 System.out.println("---------------------");
16 UpRighPhone upRighPhone = new UpRighPhone(new Xiaomi());
17 upRighPhone.open();
18 upRighPhone.close();
19 upRighPhone.call();
20
21 System.out.println("---------------------");
22 UpRighPhone upRighPhone1 = new UpRighPhone(new Vivo());
23 upRighPhone1.open();
24 upRighPhone1.close();
25 upRighPhone1.call();
26 }
27 }