1.桥接模式概念
在《Head First Design Patterns》文中是这么介绍桥接模式的,“不仅可以改变你的实现,也可以改变你的抽象”。这句话说得一头雾水,这里的实现和抽象指的是什么呢?下面会通过例子来解释。
2.桥接模式的作用
把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
3.使用场景
实现系统可能有多个角度分类,每一种角度都可能变化。说实话,我不懂怎么总结,只能通过例子来说明。
4.优点和缺点
优点
1、抽象和实现的分离,不会互相影响。
2、对于具体的抽象类的修改,不会影响到客户。
缺点
增加系统的理解与设计难度。
5.例子解析
这是一个遥控器和TV的例子。遥控器控制TV,不同的遥控器控制不同的TV.
遥控器抽象类(这个类可以是抽象类或者是接口)
package com.lgy.test;
/**
* @author LGY
* 把抽象化与实现化解耦,使得二者可以独立变化。这句化还真不好理解。我自己理解是这样的就以遥控器和TV来解释。
* 不同的遥控器控制不同的TV。这里遥控器和TV都有可能发生变化,为了实现解耦,最好就是能将她们分开,独立让他们变化。
* 但是这里的抽象化和实现化指的是啥?就本例来说,抽象化指的是遥控器,实现化指的是TV.只要我们能够区分是谁控制谁就很好理解了
* 这里很明显是遥控器控制TV.而且代码中也很明显,RemoteControl和TV的关系是RemoteControl Has-a TV的关系
*/
public abstract class RemoteControl {
TV imprementor;
public RemoteControl(TV imprementor) {
this.imprementor = imprementor;
}
abstract void on();
abstract void off();
public void setChannel(int station)
{
imprementor.tuneChannel(station);
}
}
遥控器具体实现类
package com.lgy.test;
public class ConcrateRemote extends RemoteControl{
public ConcrateRemote(TV imprementor) {
super(imprementor);
}
private int currentStation;
@Override
void on() {
imprementor.on();
}
@Override
void off() {
imprementor.off();
}
public void setStation(int station) {
this.currentStation = station;
}
public void nextChannel() {
setStation(currentStation+1);
setChannel(currentStation);
}
public void previousChannel() {
setStation(currentStation-1);
setChannel(currentStation);
}
}
TV接口
package com.lgy.test;
public interface TV {
void on();
void off();
void tuneChannel(int station);
}
TV具体类:RCA
package com.lgy.test;
public class RCA implements TV{
@Override
public void on() {
System.out.println("RCA ON");
}
@Override
public void off() {
System.out.println("RCA OFF");
}
@Override
public void tuneChannel(int station) {
System.out.println("RCA current station "+station);
}
}
TV具体类:Sony
package com.lgy.test;
public class Sony implements TV{
@Override
public void on() {
System.out.println("Sony ON");
}
@Override
public void off() {
System.out.println("Sony OFF");
}
@Override
public void tuneChannel(int station) {
System.out.println("Sony current station "+station);
}
}
客户端:
package com.lgy.test;
public class Client {
public static void main(String[] args) {
TV tv = new RCA();
ConcrateRemote concrateRemote = new ConcrateRemote(tv);
concrateRemote.on();
concrateRemote.nextChannel();
concrateRemote.nextChannel();
concrateRemote.nextChannel();
concrateRemote.nextChannel();
concrateRemote.previousChannel();
concrateRemote.off();
}
}
6.总结
把抽象化与实现化解耦,使得二者可以独立变化。这句化还真不好理解。我自己理解是这样的,就以遥控器和TV来解释。不同的遥控器控制不同的TV。这里遥控器和TV都有可能发生变化,为了实现解耦,最好就是能将她们分开,独立让他们变化。但是这里的抽象化和实现化指的是啥?就本例来说,抽象化指的是遥控器,实现化指的是TV.只要我们能够区分是谁控制谁就很好理解了,这里很明显是遥控器控制TV.而且代码中也很明显,RemoteControl和TV的关系是RemoteControl Has-a TV的关系。