加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 02:16:12 所属栏目:百科 来源:网络整理
导读:桥接模式 桥接模式,将抽象部分与它的实现部分分离,使他们都可以独立地变化。 结构图 代码实现 抽象部分Abstraction /** * 抽象 * * @author xukai 2016年3月28日 下午11:04:11 * */public class Abstraction {protected Implementor implementor;public vo

桥接模式

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

结构图

代码实现

抽象部分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对象的一部分。(一只大雁和雁群)
合成是一种强的“拥有”关系,体现了严格的部分和整体的关系。(大雁翅膀和一只大雁)

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

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

第二种:按照软件分类

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读