首页 > 编程语言 >JAVA设计模式-桥接模式

JAVA设计模式-桥接模式

时间:2022-10-25 16:47:59浏览次数:80  
标签:10 xpyvip 桥接 void blog shape JAVA 设计模式 public

JAVA设计模式-桥接模式

一、介绍

桥接模式是一种结构型模式,它主要是将抽象部分和实现部分进行分离,可以独立变化,降低类与类之间的耦合度。

举例:我们现在需要实现不同形状,每个形状还要有不同的颜色,我们传统方式是定义一个形状类,再定义每一个不同的形状实现类,继承上面的形状类,这是形状的需求已经完成,接下来我们实现不同形状不同颜色的需求,我们需要再定义形状颜色类,继承上面的形状,每个形状颜色类定义不同的颜色,此时我们会发现扩展会非常麻烦并且层次非常多,这时我们可以使用桥接模式,将形状和颜色的抽象、实现分离开来。

image-20221018225114482

二、参与者

  1. 抽象类(Abstraction): 里面包含了一个实现类接口的引用,两者是聚合关系。
  2. 扩充抽象类(RefinedAbstraction): 是抽象类的子类,实现父类中的方法。
  3. 实现类接口(Implementor): 定义基本操作,抽象类是定义了基于基本操作的较高层次的操作。
  4. 具体实现类(ConcreteImplementor): 实现Implementor接口,并定义具体的实现操作。
  5. 客户端(Client): 调用者

三、类图

image-20221018230455157

四、具体实现

Abstraction类

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.bridging
 * @Description: 抽象类
 * @Author: xpy
 * @Date: Created in 2022年10月18日 10:54 下午
 */
public abstract class Shape {

    Color color;

    public void setColor(Color color) {
        this.color = color;
    }

    public abstract void draw();
}

RefinedAbstraction类

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.bridging
 * @Description: 长方形
 * @Author: xpy
 * @Date: Created in 2022年10月18日 10:57 下午
 */
public class Rectangle extends Shape{
    @Override
    public void draw() {
        color.paint("长方形");
    }
}
/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.bridging
 * @Description: 圆形
 * @Author: xpy
 * @Date: Created in 2022年10月18日 10:57 下午
 */
public class Circular extends Shape{
    @Override
    public void draw() {
        color.paint("圆形");
    }
}

Implementor类

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.bridging
 * @Description: 实现类接口
 * @Author: xpy
 * @Date: Created in 2022年10月18日 10:54 下午
 */
public interface Color {

    void paint(String shape);
}

ConcreteImplementor类

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.bridging
 * @Description: 红色
 * @Author: xpy
 * @Date: Created in 2022年10月18日 10:59 下午
 */
public class RedColor implements Color{
    public void paint(String shape) {
        System.out.println("红色的" + shape);
    }
}
/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.bridging
 * @Description: 黄色
 * @Author: xpy
 * @Date: Created in 2022年10月18日 10:59 下午
 */
public class YellowColor implements Color{
    public void paint(String shape) {
        System.out.println("黄色的" + shape);
    }
}

Client类

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.bridging
 * @Description: 客户端
 * @Author: xpy
 * @Date: Created in 2022年10月18日 11:00 下午
 */
public class Client {
    public static void main(String[] args) {
        RedColor redColor = new RedColor();
        YellowColor yellowColor = new YellowColor();
        Shape shape = new Rectangle();
        shape.setColor(redColor);
        shape.draw();
        shape.setColor(yellowColor);
        shape.draw();
        shape = new Circular();
        shape.setColor(redColor);
        shape.draw();
        shape.setColor(yellowColor);
        shape.draw();
    }
}

总结

优点:

  1. 抽象和实现进行了分离,降低了耦合度
  2. 提高了可扩展性

缺点:

  1. 增加了系统的理解和设计的难度,对开发者要求提高。
  2. 需要对需求可以正确分辨出两个独立变化的维度,不是所有需求都可以适用,有局限性。

原文链接:https://monkey.blog.xpyvip.top/archives/java-she-ji-mo-shi---qiao-jie-mo-shi

标签:10,xpyvip,桥接,void,blog,shape,JAVA,设计模式,public
From: https://www.cnblogs.com/aibianchengya/p/16804734.html

相关文章

  • Javaweb知识复习--MyBatis+Mapper代理开发
    一种持久层框架,主要用于简化JDBCMyBatis应用步骤1、在数据库里面创建一个表2、创建模块,导入坐标就是新建一个Maven项目,在pom.xml里面导入mybatis相应导包依赖代码:3、......
  • Java初始化
    Java初始化1、采用init:@Autowiredpublicvoidinit(){sysDictFeignClient.dictByCode(GlobalConst.WARN_STAT_PERIOD_TYPE).getData().forEach(v->{statP......
  • JavaScript对象Date和JavaScript对象Math
    JavaScript对象DateDate:日期对象1.创建:vardate=newDate();2.方法:......
  • javascript
    requirejs是干啥的啊?曾经,我们将一些js组件放到不同的文件,然后通过script标签引入,如果几个组件有依赖,那么要小心了,你必须将被依赖的放到前面,否则的话会出现啥啥啥isundefi......
  • Java数组
    Java数组什么是数组数组是相同类型数据的有序集合。数组声明创建//声明dataType[]arrayName;//首选方法dataTpearrayName[];//创建使用new操作符创建数组dataTy......
  • JavaScriptDOM的一些方法和事件笔记:className、classList、setInterval、click、mouse
    className():替换原有类classList.add():添加类classList.remove():删除类classList.toggle():切换类setInterval(回调函数,毫秒数):间歇性定时器click:点击事件mousemove:......
  • 621 JavaScript_对象_RegExp1 and 622 JavaScript_对象_RegExp2
    JavaScript_Number1.创建varmyNum=newNumber(value);varmyNum=Number(value);参数value是要创建的Number对象的数值,或是要转......
  • java学习笔记41
    面向对象抽象类packageoopzong.oop.oop7;//abstract抽象类:类extends:单继承  (接口可以多继承)publicabstractclassAction{  //约束~有人帮我们实现 ......
  • JavaScriptDOM节点操作:parentNode、children、nextElementSibling、previousElementS
    元素.parentNode:获取元素的最近一级父级节点父元素.children:获取所有子元素元素.nextElementSibling:获取元素的下一个同级元素元素.previousElementSibling:获取元素的上......
  • 619 Javascript_对象_Date and 620 Javascript_对象_Math
    Javascript_Boolenan1.创建  newBoolean(value);   //构造函数  Boolean(value);      //转换函数2.方法toStri......