首页 > 编程语言 >桥接模式【Java设计模式】

桥接模式【Java设计模式】

时间:2022-10-04 10:36:55浏览次数:55  
标签:Java 桥接 int radius DrawApi 设计模式 public 实现


桥接模式【Java设计模式】

前言


2022/9/23 13:34

路漫漫其修远兮,吾将上下而求索


本文是根据袁庭新老师学习所做笔记

仅供学习交流使用,转载注明出处



桥接模式

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。

介绍

意图: 将抽象部分与实现部分分离,使它们都可以独立的变化。

主要解决: 在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。

何时使用: 实现系统可能有多个角度分类,每一种角度都可能变化。

如何解决: 把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。关键代码:抽象类依赖实现类。

关键代码: 抽象类依赖实现类。

应用实例:

1.猪八戒从天蓬元帅转世投胎到猪,转世投胎的机制将尘世划分为两个等级,即:灵魂和肉体.前者相当于抽象化,后者相当于实现化。生灵通过功能的委派,调用肉体对象的功前,使得生灵可以动态地选择。

2墙上的开关,可以看到的开关是抽象的,不用管里面具体怎么实现的。

忧点:

1.抽象和实现的分离。

2.优秀的扩展能力。

3.实现细节对客户透明。

缺点: 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

使用场景:
1.如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。

2.对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。

3.一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

注意事项: 对于两个独立变化的维度,使用桥接模式再适合不过了。

实现

我们通过下面的实例来演示桥接模式(Bridge Pattern)的用法。其中,可以使用相同的油象类方法但是不同的桥接实现类,来画出不同题色的圆。

我们有一个作为桥接实现的DrawAPl接口和实现了DravAPl接口的实现类RedCirrle、GreenCircle。Shape是一个抽象类,将使用DrawAPl的对象。BridlgePatternDemo类使用shape类来画出不同颜色的圆。

桥接模式【Java设计模式】_抽象类

1.创建一个项目名称为bridge_pattern的Java项目。

2.创建桥接实现接口DrawAPI

package com.js;

/**
* 桥接接口
*/
public interface DrawApi {
void drawCircle(int radius,int x,int y);
}

2.创建实现DrawAPI的类

package com.js;

/**
* 填充红色的业务类
*/
public class RedCircle implements DrawApi{
@Override
public void drawCircle(int radius, int x, int y) {
System.out.println("填充红色,"+"radius="+radius+",x="+x+",y="+y);
}
}
package com.js;

/**
* 填充绿色的业务类
*/
public class GreenCircle implements DrawApi{
@Override
public void drawCircle(int radius, int x, int y) {
System.out.println("填充绿色,"+"radius="+radius+",x="+x+",y="+y);
}
}

3.创建Shape类

package com.js;

public abstract class Shape {
//重点:抽象类中依赖了具体的实现,具体的实现剥离出去进行了独立的定义
//抽象与具体解耦,桥接模式关键步骤
public DrawApi drawApi;//表示颜色填充的属性

public Shape(DrawApi drawApi){
this.drawApi=drawApi;
}

public abstract void draw();//具体绘制动作实现交给子类来完成

}

4.创建Circle类

package com.js;

public class Circle extends Shape{

private int radius;
private int x;
private int y;

//Alt+Insert
public Circle(DrawApi drawApi, int radius, int x, int y) {
super(drawApi);
this.radius = radius;
this.x = x;
this.y = y;
}

@Override
public void draw() {
//用来表示具体绘制的动作
//重点:调用具体的实现,来完成图形的绘制
drawApi.drawCircle(radius,x,y);
}
}

5.编写程序入口

package com.js;

public class BridgePattern {
public static void main(String[] args) {
//创建对应的图形,需要传递对应的参数信息
//DrawApi创建一个符合当前接口规范的对象
DrawApi drawApi1=new RedCircle();
Circle circle=new Circle(drawApi1,3,100,200);
circle.draw();

DrawApi drawApi2=new GreenCircle();
Circle circle2=new Circle(drawApi2,3,100,200);
circle2.draw();
}
}

6.结果

填充红色,radius=3,x=100,y=200
填充绿色,radius=3,x=100,y=200

最后


2022/9/23 14:04


p6


Markdown 2831 字数 205 行数
HTML 2500 字数 115 段落



标签:Java,桥接,int,radius,DrawApi,设计模式,public,实现
From: https://blog.51cto.com/u_15719556/5731050

相关文章

  • Java10/04
    数组1.数组概述数组的定义:数组是相同类型数据的有序集合数组描述的是相同类型的若干个数控,按照一定的先后次序排列组合而成其中,每一个数据称为一个数组元素,每个数......
  • javaheima15 递归
    JavaFile作用创建对象定位文件,可以删除、获取文件信息等。但不能读写文件内容。构建对象的方式Filefile=newFile(“文件/文件/绝对路径/相对路径”);File类创......
  • Java手写实现链表队列和数组队列【数据结构与算法】
    packagealgorithm;/**@authorAdministrator@date2022-09-1317:50*/publicclassQueueLinked{privatestaticclassNode{Eitem;Nodenext;publicNode(Eitem,N......
  • Java手写实现栈【数据结构与算法】
    packagealgorithm;importjava.util.Arrays;importjava.util.Iterator;/**@authorAdministrator@date2022-09-1216:38数组栈*/publicclassMyArrayStack{//定义......
  • Java 四则运算 继承版
    packageT1;importjava.util.Scanner;publicclassA_Text{staticinttitle_n=30;staticScannercin=newScanner(System.in);publicstaticvoidmain(......
  • Java中的多态
    Java中的多态一、多态的概述1、同一个对象,在不同时刻表现出来的不同形态2、多态的前提和体现有继承/实现关系有方法重写有父类引用指向子类对象3、代码示例:......
  • java基础 Arrays.sort()用法
    1.作用对数组按照一定顺序排列,默认为升序。排列过程中为快排,不需要额外的空间,也不需要重新定义一个数组来接收它。示例:publicclassTest{publicstaticvoidm......
  • 每天一个小java练习(牢子好可爱啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊)2022.10.1
    练习题:接收用户输入的3个整数,并将它们的最大值作为结果输出:下面是我的代码以及运行截图啦啦啦啦:  这个本身很基础,,但是涉及到了?:的用法,就记录一下......
  • 力扣205(java)-同构字符串(简单)
    题目:给定两个字符串 s 和 t ,判断它们是否是同构的。如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。每个出现的字符都应当映射到另一......
  • 程序、进程和线程 Java多线程的状态【杭州多测师】【杭州多测师_王sir】
    CPU是以时间片的方式为进程分配CUP处理时间的,如果当一个进程同时要完成几件事的时候,如当从网上下载文件的时候,需要一边下载一边显示进度而且还要一边保存,如果按照单线程的......