设计模式

设计模式之禅- 桥梁模式

2020-12-25  本文已影响0人  凉快先生

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 原则

上一篇下一篇

猜你喜欢

热点阅读