定义
桥接模式:将抽象和 实现解耦,使得两者可以独立地变化。
桥接模式有4种角色:
● Abstraction——抽象化角色
它的主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般 是抽象类。如下面例子的Product抽象类。
● Implementor——实现化角色
它是接口或者抽象类,定义角色必需的行为和属性。 如下面例子的Company抽象类
● RefinedAbstraction——修正抽象化角色
它引用实现化角色对抽象化角色进行修正。如下面例子的House、Clothes和Iphone类。
● ConcreteImplementor——具体实现化角色
它实现接口或抽象类定义的方法和属性。如下面例子的HouseCompany与MyCompany类。
案例
/**
* 抽象产品类
*/
public abstract class Product {
//生产产品
public abstract void beProduced();
//销售产品
public abstract void beSelled();
}
/**
* 房子
*/
public class House extends Product {
@Override
public void beProduced() {
System.out.println("生产房子...");
}
@Override
public void beSelled() {
System.out.println("销售房子...");
}
}
/**
* 衣服
*/
public class Clothes extends Product {
@Override
public void beProduced() {
System.out.println("生产衣服...");
}
@Override
public void beSelled() {
System.out.println("销售衣服...");
}
}
/**
* 苹果手机
*/
public class Iphone extends Product {
@Override
public void beProduced() {
System.out.println("生产苹果手机...");
}
@Override
public void beSelled() {
System.out.println("销售苹果手机...");
}
}
/**
* 抽象公司类
*/
public abstract class Company {
//公司产品
private Product product;
public Company(Product product) {
this.product = product;
}
//设置产品
public void setProduct(Product product) {
this.product = product;
}
//赚钱
public void makeMoney() {
this.product.beProduced();
this.product.beSelled();
}
}
/**
* 房地产公司
*/
public class HouseCompany extends Company {
public HouseCompany(Product product) {
super(product);
}
public void makeMoney() {
super.makeMoney();
System.out.println("房地产公司赚钱啦...");
}
}
/**
* 我的公司
*/
public class MyCompany extends Company {
public MyCompany(Product product) {
super(product);
}
public void makeMoney() {
super.makeMoney();
System.out.println("我的公司赚钱啦...");
}
}
public class BridgePatternDemo {
public static void main(String[] args) {
House house = new House();
HouseCompany houseCompany = new HouseCompany(house);
houseCompany.makeMoney();
Clothes clothes = new Clothes();
MyCompany myCompany = new MyCompany(clothes);
myCompany.makeMoney();
System.out.println("替换产品啦啦啦~~~");
myCompany.setProduct(new Iphone());
myCompany.makeMoney();
}
}
在这个了例子种,产品类和公司类进行了解耦,我门可以自定义别的产品类,只要继承了Product抽象类即可。