Java设计模式-桥接模式

目录

一、手机操作问题

二、传统方法

三、基本介绍

四、原理类图

五、使用桥接模式解决手机问题


一、手机操作问题

现在对不同手机类型的不同品牌实现操作编程( 比如 : 开机、关机、上网,打电话等) , 如图:

二、传统方法

传统方案解决手机操作问题分析

  1. 扩展性问题(类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各个品牌手机的类,同样如果我们增加一个手机品牌,也要在各个手机样式类下增加。
  2. 违反了单一职责原则,当我们增加手机样式时,要同时增加所有品牌的手机,这样增加了代码维护成本.
  3. 解决方案-使用桥接模式

三、基本介绍

桥接模式 (Bridge 模式 ) 是指:将 实现抽象 放在两个不同的类层次中,使两个层次可以独立改变。 是一种结构型设计模式
Bridge 模式基于 类的最小设计原则 ,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction) 与行为实现 (Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展

四、原理类图


原理类图说明

  1. Client类:桥接模式的调用者
  2. 抽象类(Abstraction) :维护了 Implementor / 即它的实现类ConcreteImplementorA.., 二者是聚合关系, Abstraction 充当桥接类
  3. RefinedAbstraction: 是 Abstraction 抽象类的子类
  4. Implementor: 行为实现类的接口
  5. ConcretelmplementorA/B : 行为的具体实现类
  6. 从 UML 图:这里的抽象类和接口是聚合的关系,其实调用和被调用关系

五、使用桥接模式解决手机问题

使用 桥接模式 改进传统方式,让程序具有搞好的扩展性,利用程序维护

使用桥接模式对应的类图

手机类,持有品牌类对象

java 复制代码
public abstract class Phone {
	
	//组合品牌
	private Brand brand;

	//构造器
	public Phone(Brand brand) {
		super();
		this.brand = brand;
	}
	
	protected void open() {
		this.brand.open();
	}
	protected void close() {
		brand.close();
	}
	protected void call() {
		brand.call();
	}
	
}

子类

java 复制代码
//折叠式手机类,继承 抽象类 Phone
public class FoldedPhone extends Phone {

	//构造器
	public FoldedPhone(Brand brand) {
		super(brand);
	}
	
	public void open() {
		super.open();
		System.out.println(" 折叠样式手机 ");
	}
	
	public void close() {
		super.close();
		System.out.println(" 折叠样式手机 ");
	}
	
	public void call() {
		super.call();
		System.out.println(" 折叠样式手机 ");
	}
}
==============================================
public class UpRightPhone extends Phone {
	
		//构造器
		public UpRightPhone(Brand brand) {
			super(brand);
		}
		
		public void open() {
			super.open();
			System.out.println(" 直立样式手机 ");
		}
		
		public void close() {
			super.close();
			System.out.println(" 直立样式手机 ");
		}
		
		public void call() {
			super.call();
			System.out.println(" 直立样式手机 ");
		}
}

品牌类

java 复制代码
//接口
public interface Brand {
	void open();
	void close();
	void call();
}

品牌子类

java 复制代码
public class Vivo implements Brand {

	@Override
	public void open() {
		// TODO Auto-generated method stub
		System.out.println(" Vivo手机开机 ");
	}

	@Override
	public void close() {
		// TODO Auto-generated method stub
		System.out.println(" Vivo手机关机 ");
	}

	@Override
	public void call() {
		// TODO Auto-generated method stub
		System.out.println(" Vivo手机打电话 ");
	}

}

==================================================
public class XiaoMi implements Brand {

	@Override
	public void open() {
		// TODO Auto-generated method stub
		System.out.println(" 小米手机开机 ");
	}

	@Override
	public void close() {
		// TODO Auto-generated method stub
		System.out.println(" 小米手机关机 ");
	}

	@Override
	public void call() {
		// TODO Auto-generated method stub
		System.out.println(" 小米手机打电话 ");
	}

}

客户端

java 复制代码
public class Client {

	public static void main(String[] args) {
		
		//获取折叠式手机 (样式 + 品牌 )
		
		Phone phone1 = new FoldedPhone(new XiaoMi());
		
		phone1.open();
		phone1.call();
		phone1.close();
		
		System.out.println("=======================");
		
		Phone phone2 = new FoldedPhone(new Vivo());
		
		phone2.open();
		phone2.call();
		phone2.close();
		
		System.out.println("==============");
		
		UpRightPhone phone3 = new UpRightPhone(new XiaoMi());
		
		phone3.open();
		phone3.call();
		phone3.close();
		
		System.out.println("==============");
		
		UpRightPhone phone4 = new UpRightPhone(new Vivo());
		
		phone4.open();
		phone4.call();
		phone4.close();
	}
}
相关推荐
搞不懂语言的程序员7 分钟前
模板方法模式详解
java·开发语言·模板方法模式
〆、风神10 分钟前
Spring Boot 自定义 Redis Starter 开发指南(附动态 TTL 实现)
spring boot·redis·后端
Asthenia041216 分钟前
HashMap 扩容机制与 Rehash 细节分析
后端
DataFunTalk18 分钟前
不是劝退,但“BI”基础不佳就先“别搞”ChatBI了!
前端·后端
星星电灯猴19 分钟前
flutter项目 发布Google Play
后端
Java小混子23 分钟前
Spring MVC
java·spring·mvc
用户97044387811630 分钟前
按图搜索1688商品(拍立淘)API 返回值说明
javascript·后端·算法
Fly_hao.belief30 分钟前
Spring Boot 框架注解:@ConfigurationProperties
java·spring boot·后端
代码吐槽菌33 分钟前
基于SpringBoot的水产养殖系统【附源码】
java·数据库·spring boot·后端·毕业设计
尽一份心出一份力34 分钟前
等不是办法,干才有希望,快速跑通graphRag
后端·机器学习·开源