一、桥接模式
1、介绍
- 桥接模式是一种结构型设计模式
- 桥接模式是将实现和抽象放在两个不同的类层次中,使两个层次可以独立改变
- 桥接模式是基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象和行为实现分离开来,从而可以保持各个部分的独立性以及应对它们的功能扩展
2、图解
UML图说明:
- Client类:桥接模式的调用者
- 抽象类(Phone):聚合了Brand接口。在这里是桥接类的角色
- AlmostPhone/FoldPhone/SlidePhone继承了抽象类(Phone)
- 接口(Brand):行为实现类的接口
- HW/XM:行为具体实现类
- 抽象类(Phone)和接口(Brand)是聚合关系,调用和被调用的关系
二、普通模式
1、问题
2、介绍
使用普通模式来解决手机扩展问题:
- 如果我们要增加手机的样式(曲面屏),我们需要添加三个类。一个样式类,两个继承该样式的品牌手机类。
- 如果我们要增加一个手机品牌(锤子),我们也需要添加三个类。三个分别继承全面屏、折叠、滑盖的手机类
- 增加品牌或样式都会增加大量的类,形成类爆炸(很多类),不便于管理
- 违反了职责单一原则,当我们增加手机样式时,要同时增加所有品牌手机;这样增加了代码维护成本
3、UML
4、代码
/**
* 手机
*/
public class Phone {
public void call(){
System.out.println("使用手机打电话...");
}
}
/**
* 全面屏手机
*/
public class AlmostPhone extends Phone{
@Override
public void call(){
System.out.println("使用全面屏手机打电话...");
}
}
/**
* 折叠手机
*/
public class FoldPhone extends Phone{
@Override
public void call(){
System.out.println("使用折叠手机打电话...");
}
}
/**
* 滑盖手机
*/
public class SlidePhone extends Phone{
@Override
public void call(){
System.out.println("使用滑盖手机打电话...");
}
}
/**
* 华为全面屏手机
*/
public class HWAlmostPhone extends AlmostPhone{
@Override
public void call(){
System.out.println("使用华为全面屏手机打电话...");
}
}
/**
* 全小米面屏手机
*/
public class XMAlmostPhone extends AlmostPhone{
@Override
public void call(){
System.out.println("使用小米全面屏手机打电话...");
}
}
/**
* 华为折叠手机
*/
public class HWFoldPhone extends FoldPhone{
@Override
public void call(){
System.out.println("使用华为折叠手机打电话...");
}
}
/**
* 小米折叠手机
*/
public class XMFoldPhone extends FoldPhone{
@Override
public void call(){
System.out.println("使用小米折叠手机打电话...");
}
}
/**
* 华为滑盖手机
*/
public class HWSlidePhone extends SlidePhone{
@Override
public void call(){
System.out.println("使用华为滑盖手机打电话...");
}
}
/**
* 小米滑盖手机
*/
public class XMSlidePhone extends SlidePhone{
@Override
public void call(){
System.out.println("使用小米滑盖手机打电话...");
}
}
三、桥接设计模式
1、介绍
使用桥接设计模式改进普通设计模式:
- 当我们增加手机品牌是,只需增加一个类
- 当我们增加手机样式时,也只需增加一个类
- 解决类爆炸问题
- 程序具有了更好的扩展性和维护性
2、UML
3、代码
/**
* 手机
*/
public abstract class Phone {
private Brand brand;
public Phone(Brand brand){
this.brand = brand;
}
public void open(){
brand.open();
}
public void close(){
brand.close();
}
public void call(){
brand.call();
}
}
/**
* 全面屏手机
*/
public class AlmostPhone extends Phone {
public AlmostPhone(Brand brand) {
super(brand);
}
@Override
public void open() {
super.open();
System.out.println("全面屏手机");
}
@Override
public void close() {
super.close();
System.out.println("全面屏手机");
}
@Override
public void call(){
super.call();
System.out.println("全面屏手机");
}
}
/**
* 折叠手机
*/
public class FoldPhone extends Phone {
public FoldPhone(Brand brand) {
super(brand);
}
@Override
public void open() {
super.open();
System.out.println("折叠手机");
}
@Override
public void close() {
super.close();
System.out.println("折叠手机");
}
@Override
public void call(){
super.call();
System.out.println("折叠手机");
}
}
/**
* 滑盖手机
*/
public class SlidePhone extends Phone {
public SlidePhone(Brand brand) {
super(brand);
}
@Override
public void open() {
super.open();
System.out.println("滑盖手机");
}
@Override
public void close() {
super.close();
System.out.println("滑盖手机");
}
@Override
public void call(){
super.call();
System.out.println("滑盖手机");
}
}
/**
* 品牌
*/
public interface Brand {
void open();
void close();
void call();
}
/**
* 品牌:华为
*/
public class HW implements Brand{
@Override
public void open() {
System.out.println("华为手机开机");
}
@Override
public void close() {
System.out.println("华为手机关机");
}
@Override
public void call() {
System.out.println("华为手机打电话");
}
}
/**
* 品牌:小米
*/
public class XM implements Brand{
@Override
public void open() {
System.out.println("小米手机开机");
}
@Override
public void close() {
System.out.println("小米手机关机");
}
@Override
public void call() {
System.out.println("小米手机打电话");
}
}
/**
* 测试
*/
public class Test {
public static void main(String[] args) {
Brand brand = new XM();
Phone phone = new AlmostPhone(brand);
phone.open();
phone.call();
phone.close();
}
}
blic void close() {
System.out.println("小米手机关机");
}
@Override
public void call() {
System.out.println("小米手机打电话");
}
}
/**
* 测试
*/
public class Test {
public static void main(String[] args) {
Brand brand = new XM();
Phone phone = new AlmostPhone(brand);
phone.open();
phone.call();
phone.close();
}
}