背景:经营两个公司,生产产品赚钱。
第一步,产品类
package com.teng.pattern.impl;
/**
* 产品抽象类
* <br>创建日期:2016年7月3日
* <br><b>Copyright 2016 tengxiang All Rights Reserved</b>
* @author tengxiang
* @since 1.0
* @version 1.0
*/
public abstract class Product {
/**
* 被生产
* @since 1.0
* <br><b>作者: @author tengxiang</b>
* <br>创建时间:2016年7月3日 下午1:01:26
*/
public abstract void beProduct();
/**
* 被销售
* @since 1.0
* <br><b>作者: @author tengxiang</b>
* <br>创建时间:2016年7月3日 下午1:01:35
*/
public abstract void beSell();
}
两个实现类:
package com.teng.pattern.impl;
/**
* 房子
* <br>创建日期:2016年7月3日
* <br><b>Copyright 2016 tengxiang All Rights Reserved</b>
* @author tengxiang
* @since 1.0
* @version 1.0
*/
public class House extends Product {
@Override
public void beProduct() {
System.out.println("造房子。。。");
}
@Override
public void beSell() {
System.out.println("卖房子。。。");
}
}
package com.teng.pattern.impl;
/**
* ipad
* <br>创建日期:2016年7月3日
* <br><b>Copyright 2016 tengxiang All Rights Reserved</b>
* @author tengxiang
* @since 1.0
* @version 1.0
*/
public class Ipad extends Product {
@Override
public void beProduct() {
System.out.println("生产ipad。。。");
}
@Override
public void beSell() {
System.out.println("出售ipad。。。");
}
}
第二步,公司类
package com.teng.pattern.impl;
/**
* 公司抽象类
* <br>创建日期:2016年7月3日
* <br><b>Copyright 2016 tengxiang All Rights Reserved</b>
* @author tengxiang
* @since 1.0
* @version 1.0
*/
public abstract class Corp {
private Product product;
/**
* 设置要生产的产品
* @since 1.0
* @param product
* <br><b>作者: @author tengxiang</b>
* <br>创建时间:2016年7月3日 下午1:03:43
*/
public void setProduct(Product product){
this.product = product;
}
/**
* 赚钱
* @since 1.0
* <br><b>作者: @author tengxiang</b>
* <br>创建时间:2016年7月3日 下午1:04:47
*/
public void makeMoney(){
this.product.beProduct();
this.product.beSell();
}
}
公司实现类:
package com.teng.pattern.impl;
/**
* 房产公司
* <br>创建日期:2016年7月3日
* <br><b>Copyright 2016 tengxiang All Rights Reserved</b>
* @author tengxiang
* @since 1.0
* @version 1.0
*/
public class HouseCorp extends Corp {
@Override
public void setProduct(Product product) {
super.setProduct(product);
}
@Override
public void makeMoney() {
super.makeMoney();
System.out.println("房产公司赚大钱。。。");
}
}
package com.teng.pattern.impl;
/**
* 山寨公司
* <br>创建日期:2016年7月3日
* <br><b>Copyright 2016 tengxiang All Rights Reserved</b>
* @author tengxiang
* @since 1.0
* @version 1.0
*/
public class ShanZhaiCorp extends Corp {
@Override
public void setProduct(Product product) {
super.setProduct(product);
}
@Override
public void makeMoney() {
super.makeMoney();
System.out.println("山寨公司赚钱。。。");
}
}
HouseCorp类和ShanZhaiCorp类的区别是有参构造的参数类型上,HouseCorp类比较明确,我就是只要House类,所以直接定义传递进来的必须是House类。
ShanZhaiCorp就不同了,它是确定不了生产什么类型。
第三步,开始赚钱
package com.teng.pattern.impl;
/**
* <br>创建日期:2016年7月3日
* <br><b>Copyright 2016 tengxiang All Rights Reserved</b>
* @author tengxiang
* @since 1.0
* @version 1.0
*/
public class Client {
/**
* 主方法
* @since 1.0
* @param args
* <br><b>作者: @author tengxiang</b>
* <br>创建时间:2016年7月3日 下午1:09:04
*/
public static void main(String[] args) {
System.out.println("房地产公司------------------------");
HouseCorp houseCorp = new HouseCorp();
houseCorp.setProduct(new House());
houseCorp.makeMoney();
System.out.println("山寨公司--------------------------");
ShanZhaiCorp shanZhaiCorp = new ShanZhaiCorp();
shanZhaiCorp.setProduct(new Ipad());
shanZhaiCorp.makeMoney();
}
}
增加公司,你要么继承Corp类,要么继承HouseCorp或ShanZhaiCorp;
增加产品,继承Product类,或者继承House类,你要把房子分为公寓房、别墅、商业用房等;
你都是在扩展,唯一你要修改的是Client类,你类都增加了哪能不修改调用,也就是说Corp类和Product类都可以自由的扩展,而不会对整个应用产生变更,这就是桥梁模式。
业务抽象角色引用业务实现角色或者说业务抽象角色的部分实现是由业务实现角色完成的。
桥梁模式的优点就是类间解耦,两个角色都可以自己扩展下去,不会相互影响,这个符合OCP原则。