桥接模式是一种结构型模式,它主要应对的是:由于实际的需要,某个类具有两个或两个以上的维度变化,如果只是用继承将无法实现这种需要,或者使得设计变得相当臃肿。
桥接模式的做法是把变化部分抽象出来,使变化部分与主类分离开来,从而将多个维度的变化彻底分离。最后,提供一个管理类来组合不同维度上的变化,通过这种组合来满足业务的需要。
桥接模式是一种结构型模式,它主要应对的是:由于实际的需要,某个类具有两个或两个以上的维度变化,如果只是用继承将无法实现这种需要,或者使得设计变得相当臃肿。
桥接模式的做法是把变化部分抽象出来,使变化部分与主类分离开来,从而将多个维度的变化彻底分离。最后,提供一个管理类来组合不同维度上的变化,通过这种组合来满足业务的需要。
结构图:
示范代码:
屋子要放的电气产品接口:
package test.edu.household.electric.appliances;
public interface Refrigerator {
public void displayRefrigerator();
}
package test.edu.household.electric.appliances;
public interface TV {
public void displayTV();
}
package test.edu.household.electric.appliances;
public interface WashingMachine {
public void displayWashingMachine();
}
具体的电气产品类:
package test.edu.household.electric.appliances.impl;
import test.edu.household.electric.appliances.Refrigerator;
public class HaierRefrigerator implements Refrigerator {
@Override
public void displayRefrigerator() {
// TODO Auto-generated method stub
System.out.println("这是海尔冰箱");
}
}
package test.edu.household.electric.appliances.impl;
import test.edu.household.electric.appliances.TV;
public class HaiXinTV implements TV {
@Override
public void displayTV() {
// TODO Auto-generated method stub
System.out.println("这是海信电视");
}
}
package test.edu.household.electric.appliances.impl;
import test.edu.household.electric.appliances.Refrigerator;
public class SamSungRefrigerator implements Refrigerator {
@Override
public void displayRefrigerator() {
// TODO Auto-generated method stub
System.out.println("这是三星冰箱");
}
}
package test.edu.household.electric.appliances.impl;
import test.edu.household.electric.appliances.TV;
public class SamSungTV implements TV {
@Override
public void displayTV() {
// TODO Auto-generated method stub
System.out.println("这是三星电视");
}
}
package test.edu.household.electric.appliances.impl;
import test.edu.household.electric.appliances.WashingMachine;
public class SamSungWashingMachine implements WashingMachine {
@Override
public void displayWashingMachine() {
// TODO Auto-generated method stub
System.out.println("这是三星洗衣机");
}
}
package test.edu.household.electric.appliances.impl;
import test.edu.household.electric.appliances.WashingMachine;
public class SiemensWashingMacthine implements WashingMachine {
@Override
public void displayWashingMachine() {
// TODO Auto-generated method stub
System.out.println("这是西门子洗衣机");
}
}
要放置电气的屋子的抽象类封装屋子的公共功能(管理类):
package test.edu.house;
import test.edu.household.electric.appliances.Refrigerator;
import test.edu.household.electric.appliances.TV;
import test.edu.household.electric.appliances.WashingMachine;
public abstract class AbsHouseElectrieAppliances {
protected Refrigerator ref;
protected TV tv;
protected WashingMachine wm;
public abstract void displayConfig();
}
具体有哪些实际的屋子要放置电气:
package test.edu.house;
import test.edu.household.electric.appliances.Refrigerator;
import test.edu.household.electric.appliances.TV;
import test.edu.household.electric.appliances.WashingMachine;
public class NonbrandHouse extends AbsHouseElectrieAppliances{
public NonbrandHouse(Refrigerator ref,TV tv,WashingMachine wm){
super.ref = ref;
super.tv = tv;
super.wm = wm;
}
@Override
public void displayConfig() {
System.out.println("此屋子内的电气:");
ref.displayRefrigerator();
tv.displayTV();
wm.displayWashingMachine();
}
}
package test.edu.house;
import test.edu.household.electric.appliances.Refrigerator;
import test.edu.household.electric.appliances.TV;
import test.edu.household.electric.appliances.WashingMachine;
public class SamSungHouse extends AbsHouseElectrieAppliances{
public SamSungHouse(Refrigerator ref,TV tv,WashingMachine wm){
super.ref = ref;
super.tv = tv;
super.wm = wm;
}
@Override
public void displayConfig() {
System.out.println("此屋子内的电气:");
ref.displayRefrigerator();
tv.displayTV();
wm.displayWashingMachine();
}
}
客户端,展示2个屋子里都有什么电气:
package test.edu.client;
import test.edu.house.AbsHouseElectrieAppliances;
import test.edu.house.NonbrandHouse;
import test.edu.house.SamSungHouse;
import test.edu.household.electric.appliances.Refrigerator;
import test.edu.household.electric.appliances.TV;
import test.edu.household.electric.appliances.WashingMachine;
import test.edu.household.electric.appliances.impl.HaiXinTV;
import test.edu.household.electric.appliances.impl.HaierRefrigerator;
import test.edu.household.electric.appliances.impl.SamSungRefrigerator;
import test.edu.household.electric.appliances.impl.SamSungTV;
import test.edu.household.electric.appliances.impl.SamSungWashingMachine;
import test.edu.household.electric.appliances.impl.SiemensWashingMacthine;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
Refrigerator ref1 = new HaierRefrigerator();
Refrigerator ref2 = new SamSungRefrigerator();
TV tv1 = new HaiXinTV();
TV tv2 = new SamSungTV();
WashingMachine wm1 = new SamSungWashingMachine();
WashingMachine wm2 = new SiemensWashingMacthine();
AbsHouseElectrieAppliances aea1 = new SamSungHouse(ref2, tv2, wm1);
AbsHouseElectrieAppliances aea2 = new NonbrandHouse(ref1, tv1, wm2);
aea1.displayConfig();
aea2.displayConfig();
}
}
此屋子内的电气:
这是三星冰箱
这是三星电视
这是三星洗衣机
此屋子内的电气:
这是海尔冰箱
这是海信电视
这是西门子洗衣机