[设计模式]之六:桥接模式

合成/聚合复用原则CARP

尽量使用合成/聚合,尽量不要使用类继承

  • 聚合Aggregation 表示一种弱的’拥有’关系,体现A对象可以包含B对象,但B对象不是A对象的一部分
  • 合成Composition 表示一种强的’拥有’关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样

比如,大雁和翅膀属于合成,大雁和雁群属于聚合

这个原则的好处是,优先使用对象的合成/聚合将有助于你保持每个类被封禁,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。

比如,A,B,C三种操作系统,X,Y,Z三种软件。每个系统都有这三种软件时,会发现一共有9种情况。

按照继承,有两种情况:

  1. 设计OS父类,ABC继承OS,ABC下分别有一个XYZ
  2. 设计Software父类,XYZ继承Software,XYZ下各有ABC三种版本

这时候,增加一种OS或者Software,再或者增加父类的方法,带来的影响就很大,导致最后规模越来越大。

定义

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

“将抽象部分与它的实现部分分离”指的是,前面的OS和Software有两种实现方式,现在就是要把这些实现分离开,独立出来,让它们各自变化。

UML

示例代码

// 软件类统一实现ISoftware接口
interface ISoftware {
	public void run();
}

public class Software_X implements ISoftware {

	@Override
	public void run() {
		System.out.println("Run software A");
	}

}

public class Software_Y implements ISoftware {

	@Override
	public void run() {
		System.out.println("Run software Y");
	}

}
// OS类统一继承IOS  因为软件和OS属于聚合关系,OS持有一个software的引用
abstract class IOS {
	protected ISoftware software;
	public void setSoftware(ISoftware sw) {
		this.software = sw;
	}
	
	public abstract void run();
}

public class OS_A extends IOS {

	@Override
	public void run() {
		System.out.println("OSA");
		software.run();
	}

}

public class OS_B extends IOS {

	@Override
	public void run() {
		System.out.println("OSB");
		software.run();
	}

}
//客户代码
public class main {

	public static void main(String[] args) {
		IOS os = new OS_A();
		os.setSoftware(new Software_X());
		os.run();
		
		os.setSoftware(new Software_Y());
		os.run();
		
		os = new OS_B();
		os.setSoftware(new Software_X());
		os.run();
		
		os.setSoftware(new Software_Y());
		os.run();
		
	}

}
//输出
OSA
Run software A
OSA
Run software Y
OSB
Run software A
OSB
Run software Y

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏有趣的django

python开发面试问题

python语法以及其他基础部分 可变与不可变类型;  浅拷贝与深拷贝的实现方式、区别;deepcopy如果你来设计,如何实现;  __new__() 与 __...

50080
来自专栏Golang语言社区

Golang实现带优先级的channel

一般Go语言同时使用多个channel的方法是使用select/case语句配合<-操作符,比如 select {case <- chan1: // do...

48670
来自专栏程序员互动联盟

【问题追踪】scanf引发的“血案”

最近我遇到C语言学习中一个比较容易让我们这种新手犯错或者忽略的地方。那就是关于scanf函数在读取字符时的问题,以及getchar()与回车的一点恩恩怨怨,换句...

29760
来自专栏机器学习算法与Python学习

Python再次更新! 解锁与优化多项新特性......

Python 3.7.0 版本于 6 月 27 号正式发布,该版本有多项重大的更新和改进,主要内容如下如下:

11800
来自专栏用户2442861的专栏

最常用的两种C++序列化方案的使用心得(protobuf和boost serialization)

http://blog.csdn.net/lanxuezaipiao/article/details/24845625

1.4K20
来自专栏PHP在线

URL短链接实现方法

最近项目开发中,需要实现URL长链接转短链接的需求,于是在网上找了一些资料,顺便整理了下,欢迎有想法的童鞋踊跃留言,我们共同探讨。

2.3K80
来自专栏技术小黑屋

你的Java代码对JIT编译友好么?

本文为 InfoQ 中文站特供稿件,首发地址为:你的Java代码对JIT编译友好么?。如需转载,请与 InfoQ 中文站联系。

30520
来自专栏猿湿Xoong

一个bit一个bit的进行 Base64 白话科普,看不懂算你输

12140
来自专栏FreeBuf

pwnable.tw刷题之dubblesort

前言 上一篇中我介绍了phttp://www.freebuf.com/articles/others-articles/134271.htmlwnable.tw...

36360
来自专栏PPV课数据科学社区

工具 | 如何在Python中调用R语言包?

R语言是非常强大的做统计分析和建模方面的开源软件,它有非常丰富的统计软件包,做统计可以说只有你想不到的,没有R办不到的。Python又是当下最流行的编程软件之一...

1.4K80

扫码关注云+社区

领取腾讯云代金券