设计模式之禅- 桥梁模式

1.业务背景

我身价过亿,有两个大公司,一个是房地产公司,一个是服装制造业,这两个公司都很赚钱,天天帮我在累加财富,其实是什么公司我倒是不关心,我关心的是是不是在赚钱,赚了多少,这才是我关心的。

2.

定义一个公司的抽象类

public abstract class Corp { 

/*

* 是公司就应该有生产,甭管是什么软件公司还是制造业公司

* 那每个公司的生产的东西都不一样,所以由实现类来完成

*/

protected abstract void produce();

/*

* 有产品了,那肯定要销售呀,不销售你公司怎么生存

*/

protected abstract void sell();

//公司是干什么的?赚钱的呀,不赚钱傻子才干

public void makeMoney(){

//每个公司都是一样,先生产

this.produce();

//然后销售

this.sell();

}

}

3.房地产公司

public class HouseCorp extends Corp {

//房地产公司就是盖房子

protected void produce() {

System.out.println("房地产公司盖房子...");

}

//房地产卖房子,自己住那可不赚钱

protected void sell() {

System.out.println("房地产公司出售房子...");

}

//房地产公司很High了,赚钱,计算利润

public void makeMoney(){

super.makeMoney();

System.out.println("房地产公司赚大钱了...");

}

}

4.看服装公司

public class ClothesCorp extends Corp {

//服装公司生产的就是衣服了

protected void produce() {

System.out.println("服装公司生产衣服...");

}

//服装公司买服装,可只卖服装,不买穿衣服的模特

protected void sell() {

System.out.println("服装公司出售衣服...");

}

//服装公司不景气,但怎么说也是赚钱行业也

public void makeMoney(){

super.makeMoney();

System.out.println("服装公司赚小钱...");

}

}

5.我要关心我自己的公司了

public class Client {

public static void main(String[] args) {

System.out.println("-------房地产公司是这个样子运行的-------");

//先找到我的公司

HouseCorp houseCorp =new HouseCorp();

//看我怎么挣钱

houseCorp.makeMoney();

System.out.println("\n");

System.out.println("-------服装公司是这样运行的-------");

ClothesCorp clothesCorp = new ClothesCorp();

clothesCorp.makeMoney();

}

}

运行结果:

-------房地产公司是这个样子运行的-------

房地产公司盖房子...

房地产公司出售房子...

房地产公司赚大钱了...

-------服装公司是这样运行的-------

服装公司生产衣服...

服装公司出售衣服...

服装公司赚小钱...

6.有一天我觉得赚钱速度太慢,通过生产山寨产品来赚钱,什么赚钱生产什么,赚过了高峰期就换个产品,打一枪换一个牌子,不承担售后成本、也不担心销路问题。

市场上前段时间比较火爆的是苹果 iPod,把服装厂改成 iPod 生产厂,看类图的变化:

public class IPodCorp extends Corp {

//我开始生产iPod了

protected void produce() {

System.out.println("我生产iPod...");

}

//山寨的iPod很畅销,便宜呀

protected void sell() {

System.out.println("iPod畅销...");

}

//狂赚钱

public void makeMoney(){

super.makeMoney();

System.out.println("我赚钱呀...");

}

}

7.我这是个山寨工厂,要及时的生产出市场上流行产品,转型要快,要灵活,今天从生产 iPod 转为生产 MP4,明天再转为生产上网本,这个都需要灵活的变化,不要限制的太死,那问题来了,每次我的厂房,我的工人,我的设备都在,不可能每次我换个山寨产品我的厂子就彻底不要了,这不行,成本忒高了点,那怎么办?

Corp 类和 Product 类建立一个关联关系,可以彻底解决我以后山寨公司生产产品的问题

这是我整个集团公司的产品类

public abstract class Product {

//甭管是什么产品它总要是能被生产出来

public abstract void beProducted();

//生产出来的东西,一定要销售出去,否则扩本呀

public abstract void beSelled();

}

看 House 产品类:

public class House extends Product {

//豆腐渣就豆腐渣呗,好歹也是个房子

public void beProducted() {

System.out.println("生产出的房子是这个样子的...");

}

//虽然是豆腐渣,也是能够销售出去的

public void beSelled() {

System.out.println("生产出的房子卖出去了...");

}

}

Clothes 产品类:

public class Clothes extends Product {

public void beProducted() {

System.out.println("生产出的衣服是这个样子的...");

}

public void beSelled() {

System.out.println("生产出的衣服卖出去了...");

}

}

iPod 产品类:

public class IPod extends Product {

public void beProducted() {

System.out.println("生产出的iPod是这个样子的...");

}

public void beSelled() {

System.out.println("生产出的iPod卖出去了...");

}

}

产品类是有了,那我们再看 Corp 抽象类:

public abstract class Corp {

//定义一个产品对象,抽象的了,不知道具体是什么产品

private Product product;

//构造函数,由子类定义传递具体的产品进来

public Corp(Product product){

this.product = product;

}

//公司是干什么的?赚钱的呀,不赚钱傻子才干

public void makeMoney(){

//每个公司都是一样,先生产

this.product.beProducted();

//然后销售

this.product.beSelled();

}

}

房地产公司:

public class HouseCorp extends Corp {

//定义传递一个House产品进来

public HouseCorp(House house){

super(house);

}

//房地产公司很High了,赚钱,计算利润

public void makeMoney(){

super.makeMoney();

System.out.println("房地产公司赚大钱了...");

}

}

山寨公司的实现:

public class ShanZhaiCorp extends Corp {

//产什么产品,不知道,等被调用的才知道

public ShanZhaiCorp(Product product){

super(product);

}

//狂赚钱

public void makeMoney(){

super.makeMoney();

System.out.println("我赚钱呀...");

}

}

我要关心我自己的公司了:

public class Client {

public static void main(String[] args) {

House house = new House();

System.out.println("-------房地产公司是这个样子运行的-------");

//先找到我的公司

HouseCorp houseCorp =new HouseCorp(house);

//看我怎么挣钱

houseCorp.makeMoney();

System.out.println("\n");

//山寨公司生产的产品很多,不过我只要指定产品就成了

System.out.println("-------山寨公司是这样运行的-------");

ShanZhaiCorp shanZhaiCorp = new ShanZhaiCorp(new Clothes());

shanZhaiCorp.makeMoney();

}

}

这个山寨公司的前身是生产衣服的,那我现在要修改一下,生产 iPod:

public class Client {

public static void main(String[] args) {

House house = new House();

System.out.println("-------房地产公司是这个样子运行的-------");

//先找到我的公司

HouseCorp houseCorp =new HouseCorp(house);

//看我怎么挣钱

houseCorp.makeMoney();

System.out.println("\n");

//山寨公司生产的产品很多,不过我只要制定产品就成了

System.out.println("-------山寨公司是这样运行的-------");

//ShanZhaiCorp shanZhaiCorp = new ShanZhaiCorp(new Clothes());

ShanZhaiCorp shanZhaiCorp = new ShanZhaiCorp(new IPod());

shanZhaiCorp.makeMoney();

}

}

8.Corp 类和Product 类都可以自由的扩展,而不会对整个应用产生太的变更,这就是桥梁模式。

桥梁模式的通用类图

中间那根带箭头的线了吗?是不是类似一个桥,连接了两个类?所以就叫桥梁模式。桥梁模式的优点就是类间解耦,我们上面已经提到,两个角色都可以自己的扩展下去,不会相互影响,这个也符合 OCP 原则

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容