设计模式----桥接模式(Bridge Pattern)例题

    桥接模式,将抽象部分与它的实现部分分离,使它们都可以独立地变化。

    应用场景:(1)解耦合抽象和实现

                     (2)抽象和实现需要分别自由扩展

    缺点:增加了设计类的数量。

    结构图:

                                                           图片来源:《大话设计模式》 程杰

    这个模式的情景引入非常有意思,俺决定记一下笔记,嗯!

    是关于手机品牌和手机软件关系的例子,有两个手机品牌:M和N,然后有通讯录和游戏两个软件。我一开始的思路也是类似于以下两种,按照品牌分类或者按照软件分类实现。

                                                           图片来源:《大话设计模式》 程杰
                                                           图片来源:《大话设计模式》 程杰

    但是这种实现方式的缺点在于如果要开发一款新的软件,要针对每一个手机品牌增添一个具体实现类,同样,如果增加一个新的手机品牌,同样要把所有需要的软件重新进行具体开发,工作量巨大。然后这就体现了桥接模式的优越性。使用桥接模式的类图如下:

                                                           图片来源:《大话设计模式》 程杰

    在这种模式下,手机品牌和手机软件可以独立变化,手机品牌和软件之间是聚合关系,像一个桥一样把品牌和软件连接起来,这样就可以独立地增加手机品牌或软件,每次只需要增加一个相应的类就可以了,不需要改动其他的类。而且符合开放-封闭原则,即对扩展是开放的,对修改是封闭的。(优秀啊优秀)

    然后下面放一下代码叭!依旧是用java实现滴~

    (1)HandsetBrand(手机品牌类):

package 桥接模式;

public abstract class HandsetBrand {
	protected HandsetSoft soft;
	//设置手机软件
	public void setHandsetSoft(HandsetSoft soft) {
		this.soft = soft;
	}
	//运行
	public abstract void Run();
}

    (2)HandBrandM、HandsetBrandN,两个具体的手机品牌:

package 桥接模式;

public class HandsetBrandM extends HandsetBrand{

	@Override
	public void Run() {
		System.out.print("M品牌手机");
		soft.Run();
	}

}
package 桥接模式;

public class HandsetBrandN extends HandsetBrand{

	@Override
	public void Run() {
		System.out.print("N品牌手机");
		soft.Run();
	}

}

    (3)HandsetSoft(手机软件类):

package 桥接模式;

public abstract class HandsetSoft {
	public abstract void Run();
}

    (4)HandsetGame、HandsetAddressList,手机游戏和手机通讯录,两个具体的手机软件类。

package 桥接模式;

public class HandsetGame extends HandsetSoft{

	@Override
	public void Run() {
		System.out.println("运行手机游戏");
	}
	
}
package 桥接模式;

public class HandsetAddressList extends HandsetSoft{

	@Override
	public void Run() {
		System.out.println("运行手机通讯录");
	}
	
}

    (5)客户端调用:

package 桥接模式;

public class Main {

	public static void main(String[] args) {
		HandsetBrand ab;
		HandsetSoft game = new HandsetGame();
		HandsetSoft list = new HandsetAddressList();
		
		ab = new HandsetBrandM();
		ab.setHandsetSoft(game);
		ab.Run();
		ab.setHandsetSoft(list);
		ab.Run();
		
		ab = new HandsetBrandN();
		ab.setHandsetSoft(game);
		ab.Run();
		ab.setHandsetSoft(list);
		ab.Run();
		
	}

}

    最后输出:

     好啦!今天十点半就可以睡了哈哈哈哈哈好开心~

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值