微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

设计模式学习笔记——桥接模式

桥接模式

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

结构图

代码实现

抽象部分Abstraction
/**
 * 抽象
 *
 * @author xukai 2016年3月28日 下午11:04:11
 * 
 */
public class Abstraction {

	protected Implementor implementor;

	public void setImplementor(Implementor implementor) {
		this.implementor = implementor;
	}

	public void operation() {
		implementor.operation();
	}

}

分离的实现抽象类Implementor
/**
 * 分离的实现
 *
 * @author xukai 2016年3月28日 下午10:47:18
 * 
 */
public abstract class Implementor {

	public abstract void operation();
	
}

具体实现方法
/**
 * 实现抽象类的具体实现方法
 *
 * @author xukai 2016年3月29日 下午11:24:56
 * 
 */
public class ConcreteImplementorA extends Implementor {

	@Override
	public void operation() {
		System.out.println("具体实现A的方法执行");
	}

}

被提炼的抽象,RefinedAbstraction
/**
 * 被提炼的抽象
 *
 * @author xukai 2016年3月29日 下午11:28:45
 * 
 */
public class RefinedAbstraction extends Abstraction {

	@Override
	public void operation() {
		implementor.operation();
	}
	
}

客户端:
public class Client {

	public static void main(String[] args) {
		Abstraction ab = new RefinedAbstraction();

		ab.setImplementor(new ConcreteImplementorA());
		ab.operation();

		ab.setImplementor(new ConcreteImplementorB());
		ab.operation();

	}

}
控制台:
具体实现A的方法执行
具体实现B的方法执行

demo

问题:手机品牌和手机软件之间的关系

结构图


代码实现

手机软件抽象类:HandsetSoft
/**
 * 手机软件
 *
 * @author xukai 2016年3月28日 下午11:38:47
 * 
 */
public abstract class HandsetSoft {

	public abstract void run();
	
}

手机品牌抽象类:HandsetBrand
/**
 * 手机品牌
 *
 * @author xukai 2016年3月28日 下午11:42:53
 * 
 */
public abstract class HandsetBrand {

	protected HandsetSoft soft;

	public void setSoft(HandsetSoft soft) {
		this.soft = soft;
	}
	
	public abstract void run();
	
}

具体品牌:
/**
 * 具体品牌
 *
 * @author xukai 2016年3月29日 下午11:36:56
 * 
 */
public class HandsetBrandA extends HandsetBrand {

	@Override
	public void run() {
		soft.run();
	}

}

具体手机游戏软件:
/**
 * 游戏软件
 *
 * @author xukai 2016年3月28日 下午11:40:21
 * 
 */
public class HandsetGame extends HandsetSoft {

	@Override
	public void run() {
		System.out.println("运行手机游戏");
	}

}
通讯录:
public class HandsetAddressList extends HandsetSoft {

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

}
客户端:
public class Client {

	public static void main(String[] args) {
		HandsetBrand ab;
		// 品牌A手机
		ab = new HandsetBrandA();
		// 添加软件
		ab.setSoft(new HandsetGame());
		ab.run();	// 运行
		// 添加软件
		ab.setSoft(new HandsetAddressList());
		ab.run();	// 运行

		// 品牌B手机
		ab = new HandsetBrandB();
		// 添加软件
		ab.setSoft(new HandsetGame());
		ab.run();	// 运行
		// 添加软件
		ab.setSoft(new HandsetAddressList());
		ab.run();	// 运行
	}

}
控制台:
运行手机游戏
手机通讯录
运行手机游戏
手机通讯录

总结

合成/聚合:
聚合表示一种弱的“拥有”关系,体现A对象可以包含B对象,但是B对象不是A对象的一部分。(一只大雁和雁群)
合成是一种强的“拥有”关系,体现了严格的部分和整体的关系。(大雁翅膀和一只大雁)

*注:尽量少用继承,多用聚合/合成。

刚才手机品牌和手机软件的关系:
第一种:按照品牌分类

第二种:按照软件分类

这两种办法都会导致强耦合,一旦添加某个功能,过于复杂。

桥接模式的“将抽象部分和它的实现部分分离”,指的是实现系统可能有多角度分类,每种分类都可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。

原文地址:https://www.jb51.cc/javaschema/284062.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐