对不同手机类型(折叠式、直立式)的不同品牌(vivo、小米)实现操作编程(开机、关机、打电话)
1.传统方法
- 扩展性问题:如果再增加手机的样式(如旋转式),就需要增加各个品牌手机的类,如果增加一个手机品牌,也要在各个手机样式类下增加
- 违反了单一职责原则,当增加手机样式时,要同时增加所有品牌的手机,增加了代码维护成本
2.桥接模式
2.1 介绍
-
将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变
-
结构型设计模式
-
基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责
-
把抽象与行为实现分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展
2.2 原理
Client
类:桥接模式的调用者Abstraction
类:抽象类(图中的Phone
),维护了Implementor
和它的实现类(如ConcreteImplementorA
),二者是聚合关系(即调用和被调用的关系), 它充当桥接类RefinedAbstraction
类:Abstraction
类的子类(图中的FoldedPhone
和UprightPhone
)Implementor
:行为实现类的接口(图中的Brand
)ConcreteImplementorA
:Implementor
类的具体实现类(图中的Vivo
和XiaoMi
)
2.3 代码实现
public interface Brand {
void open();
void close();
void call();
}
public class Vivo implements Brand {
@Override
public void open() {
System.out.println(" Vivo手机开机 ");
}
@Override
public void close() {
System.out.println(" Vivo手机关机 ");
}
@Override
public void call() {
System.out.println(" Vivo手机打电话 ");
}
}
// XiaoMi类实现步骤类似
public abstract class Phone { // 桥
// 组合品牌
private Brand brand;
public Phone(Brand brand) {
super();
this.brand = brand;
}
protected void open() {
this.brand.open();
}
protected void close() {
brand.close();
}
protected void call() {
brand.call();
}
}
public class UpRightPhone extends Phone {
public UpRightPhone(Brand brand) {
super(brand);
}
public void open() {
super.open();
System.out.println(" 直立样式手机 ");
}
public void close() {
super.close();
System.out.println(" 直立样式手机 ");
}
public void call() {
super.call();
System.out.println(" 直立样式手机 ");
}
}
// FoldedPhone类实现步骤类似
public class Client {
public static void main(String[] args) {
// 获取折叠式手机(样式 + 品牌)
Phone phone1 = new FoldedPhone(new XiaoMi());
phone1.open();
phone1.call();
phone1.close();
Phone phone2 = new FoldedPhone(new Vivo());
phone2.open();
phone2.call();
phone2.close();
UpRightPhone phone3 = new UpRightPhone(new XiaoMi());
phone3.open();
phone3.call();
phone3.close();
UpRightPhone phone4 = new UpRightPhone(new Vivo());
phone4.open();
phone4.call();
phone4.close();
}
}
3.注意事项和细节
- 实现了抽象和实现部分的分离
- 替代多层继承方案,可以减少子类的个数
- 增加了系统的理解和设计难度
参考
https://www.bilibili.com/video/BV1G4411c7N4?p=66-70