从这一专栏开始将学习设计模式,上课学习和自己总结归纳的笔记将总结出来供大家参考。
参考书籍:《设计模式就该这样学》
其他文章:
Java设计模式-UML类图 | Java设计模式-七大架构设计原则-开闭原则 |
---|---|
Java设计模式-七大架构设计原则-依赖倒置原则 | Java设计模式-七大架构设计原则-单一职责原则 |
Java设计模式-七大架构设计原则-接口隔离原则 | Java设计模式-七大架构设计原则-最少知道原则(迪米特法则) |
Java设计模式-七大架构设计原则-里氏替换原则和合成复用原则 | Java设计模式-创建型设计模式-简单工厂模式 |
Java设计模式-创建型设计模式-工厂方法模式(工厂模式) | Java设计模式-创建型设计模式-抽象工厂模式 |
Java设计模式-创建型设计模式-建造者模式 | Java设计模式-创建型设计模式-原型模式 |
Java设计模式-创建型设计模式-单例模式 | Java设计模式-结构型设计模式-适配器模式 |
Java设计模式- 结构型设计模式-享元模式 | Java设计模式- 结构型设计模式-外观模式 |
Java设计模式- 结构型设计模式-桥接模式 | Java设计模式-结构型模式设计模式-组合模式 |
Java设计模式-行为型设计模式-观察者模式 |
在GOF23种设计模式中,有三种类型的设计模式,分别是:创建型设计模式、结构型设计模式、行为型设计模式。
结构型设计模式有:代理模式、适配器模式、桥接模式、装饰模式、外观模式、享元模式、组合模式 7 种结构型模式。
类结构型模式:关心类的组合,由多个类组合成一个更大的系统,在类结构型模式中一般只存在继承关系和实现关系。
对象结构型模式:关心类与对象的组合,通过关联关系,在一个类中定义另外一个类的实例对象,然后通过该对象调用相应的方法。
桥接模式(Bridge Pattern)即将抽象部分与它的实现部分分离开来,使他们都可以独立变化。
桥接模式将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。
将抽象部分与他的实现部分分离这句话不是很好理解,其实这并不是将抽象类与他的派生类分离,而是抽象类和它的派生类用来实现自己的对象。这样还是不能理解的话。我们就先来认清什么是抽象化,什么是实现化,什么是脱耦。
在GoF23种设计模式中属于结构型设计模式:
其中包括:代理模式、适配器模式、桥接模式、装饰模式、外观模式、享元模式、组合模式 7 种结构型模式。
(1)Abstraction:抽象类
(2)RefinedAbstraction:扩充抽象类。
(3)Implementor:实现类接口。
(4)ConcreteImplementor:具体实现类 。
优点:
桥接模式可以取代多层继承的方案。 多层继承违背了单一职责原则,复用性较差,类的个数也非常多。桥接模式可以极大的减少子类的个数,从而降低管理和维护的成本。
桥接模式极大的提高了系统可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有的系统,符合开闭原则。
缺点:
会增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计与编程
正确识别出系统中两个独立变化的维度并不是一件容易的事情
案例:
现在需要开发一个跨平台的视频播放器,在Linux、Windows平台上面都能播放Mp4、AVL格式的视频。
类图如下:
CoolSummerMoonPlayer:抽象类(模拟场景中视频播放器)
LinuxPlayer、WindowsPlayer:扩充抽象类(模拟场景中Linux、Windows平台)
Media:实现类接口(模拟场景中播放器格式)
Mp4、AVL:具体实现类(模拟场景中Mp4、AVL格式)
具体代码实现:
1.CoolSummerMoonPlayer:抽象类(模拟场景中视频播放器)
public abstract class CoolSummerMoonPlayer {
private Media media;
public Media getMedia() {
return media;
}
public void setMedia(Media media) {
this.media = media;
}
public void player(){
media.format();
}
}
2.LinuxPlayer、WindowsPlayer:扩充抽象类(模拟场景中Linux、Windows平台)
public class LinuxPlayer extends CoolSummerMoonPlayer {
@Override
public void player(){
System.out.println("Linux下开始播放");
super.player();
}
}
public class LinuxPlayer extends CoolSummerMoonPlayer {
@Override
public void player(){
System.out.println("Linux下开始播放");
super.player();
}
}
3.Media:实现类接口(模拟场景中播放器格式)
public interface Media {
void format();
}
4.Mp4、AVL:具体实现类(模拟场景中Mp4、AVL格式)
public class AVL implements Media {
@Override
public void format() {
System.out.println("playing avl");
}
}
public class Mp4 implements Media{
@Override
public void format() {
System.out.println("playing mp4");
}
}
5.测试代码
public class TestBridge {
public static void main(String[] args) {
Media mp4 = new Mp4();
CoolSummerMoonPlayer linuxPlayer = new LinuxPlayer();
linuxPlayer.setMedia(mp4);
linuxPlayer.player();
Media avl = new AVL();
CoolSummerMoonPlayer windowsPlayer = new WindowsPlayer();
windowsPlayer.setMedia(avl);
windowsPlayer.player();
}
}