桥接模式属于结构型模式,主要用于某一个类,需要体现两个维度上的特征!例如一碗面条的味道可能需要蔬菜和肉的类型两个维度描述(海带鸡丝面,酸菜牛肉面等),并且每一个维度不能使用基本类型的变量描述,需要使用类描述。
桥接模式一般是由接口 + 抽象类 + 实现类描述的!
接口描述一个维度,抽象类描述另一个维度,同时抽象类本身也是一个维度,实现类继承与抽象类!
然而抽象类并不是继承于接口,而是聚合关系。接口作为抽象类的成员变量。
关于桥接模式,有一句经典名言:将抽象部分与实现部分分离,使它们都可以独立的变化。
/* * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved */ package com.pt.bridge; /** * @description 蔬菜抽象接口 * @author panteng * @date 17-2-7. */ public interface VegetablesType { public String getVegetables(); }
/* * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved */ package com.pt.bridge; /** * @description 蔬菜实现类-海带 * @author panteng * @date 17-2-8. */ public class Kelp implements VegetablesType { public String getVegetables(){ return "海带"; } }
/* * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved */ package com.pt.bridge; /** * @description 蔬菜实现类-酸菜 * @author panteng * @date 17-2-8. */ public class Sauerkraut implements VegetablesType { public String getVegetables(){ return "酸菜"; } }
/* * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved */ package com.pt.bridge; /** * @description 肉类抽象类 * @author panteng * @date 17-2-7. */ public abstract class AbstractMeatType { VegetablesType vegetablesType; public abstract String getMeat(); public String getTaste(){ return vegetablesType.getVegetables() + this.getMeat(); } public VegetablesType getVegetablesType(){ return vegetablesType; } public void setVegetablesType(VegetablesType vegetablesType){ this.vegetablesType = vegetablesType; } }
/* * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved */ package com.pt.bridge; /** * @description 肉类抽象类的实现 - 牛肉 * @author panteng * @date 17-2-8. */ public class Beef extends AbstractMeatType { @Override public String getMeat(){ return "牛肉"; } }
/* * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved */ package com.pt.bridge; /** * @description 肉类抽象类的实现 - 鸡肉 * @author panteng * @date 17-2-8. */ public class Chicken extends AbstractMeatType { @Override public String getMeat(){ return "鸡肉"; } }
/* * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved */ package com.pt.bridge; /** * @description 桥接模式的应用 * @author panteng * @date 17-2-8. */ public class Client { public static void main(String[] arges){ System.out.println("start... ..."); Kelp kelp = new Kelp(); Sauerkraut sauerkraut = new Sauerkraut(); Beef beef = new Beef(); beef.setVegetablesType(kelp); System.out.println(beef.getTaste()); beef.setVegetablesType(sauerkraut); System.out.println(beef.getTaste()); } }
解释一下抽象和实现是如何分离的,将两个维度的变化属性分别定义为抽象类,两个抽象类直接使用聚合关系,与实现无关;分别定义两个维度的实现类,两个维度的实现无关,可以独立变化;