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

Java设计模式-桥接模式

时间:2023-05-15 20:13:14浏览次数:50  
标签:Java color 桥接 int Window WindowImpl 设计模式 impl

简介

桥接模式(Bridge Pattern)是一种结构性设计模式,它的主要作用是将抽象部分和实现部分解耦,使它们可以独立变化而不会互相影响。桥接模式最早由GoF(Gang of Four)提出,在《设计模式》一书中有详细的介绍。

桥接模式和其他设计模式的区别在于它关注的是如何将抽象和实现分离,从而达到灵活性和可扩展性的目的。与之相比,适配器模式关注的是如何将不兼容的接口转换成可兼容的接口,装饰者模式关注的是如何动态地为对象添加行为,而组合模式则是将对象组合成树形结构,以表示“部分-整体”的层次结构。

实现

假设我们正在构建一个图形用户界面(GUI)框架,我们需要支持多个操作系统和窗口管理器。我们可以使用桥接模式来实现这个功能。我们可以将操作系统和窗口管理器的实现分开,以便它们可以独立地变化。我们可以定义一个抽象的Window类,它有一个实现了WindowImpl接口的实例变量。WindowImpl接口表示窗口管理器的实现。我们可以定义一个操作系统的抽象类,它有一个实现了OsImpl接口的实例变量。OsImpl接口表示操作系统的实现。

下面是一个示例代码:

interface WindowImpl {
    void draw(int x, int y, int width, int height, String color);
}

class LinuxWindowImpl implements WindowImpl {
    public void draw(int x, int y, int width, int height, String color) {
        System.out.println("Drawing a Linux window at (" + x + ", " + y + ") with width " + width + ", height " 
                           + height + ", and color " + color);
    }
}

class WindowsWindowImpl implements WindowImpl {
    public void draw(int x, int y, int width, int height, String color) {
        System.out.println("Drawing a Windows window at (" + x + ", " + y + ") with width " + width + ", height " 
                           + height + ", and color " + color);
    }
}

abstract class Window {
    private WindowImpl impl;
    
    public Window(WindowImpl impl) {
        this.impl = impl;
    }
    
    public void draw(int x, int y, int width, int height, String color) {
        impl.draw(x, y, width, height, color);
    }
}

abstract class Os {
    private WindowImpl impl;
    
    public Os(WindowImpl impl) {
        this.impl = impl;
    }
    public void drawWindow(int x, int y, int width, int height, String color) {
    	Window window = createWindow(impl);
    	window.draw(x, y, width, height, color);
    }

	protected abstract Window createWindow(WindowImpl impl);
}

class LinuxOs extends Os {
	public LinuxOs(WindowImpl impl) {
		super(impl);
	}
    protected Window createWindow(WindowImpl impl) {
    	return new LinuxWindow(impl);
	}
}

class WindowsOs extends Os {
	public WindowsOs(WindowImpl impl) {
		super(impl);
	}
    protected Window createWindow(WindowImpl impl) {
    	return new WindowsWindow(impl);
	}
}

class LinuxWindow extends Window {
	public LinuxWindow(WindowImpl impl) {
		super(impl);
	}
}

class WindowsWindow extends Window {
	public WindowsWindow(WindowImpl impl) {
		super(impl);
	}
}

在这个例子中,WindowImpl接口表示窗口管理器的实现,LinuxWindowImpl和WindowsWindowImpl类分别是Linux和Windows操作系统的窗口管理器的实现。Window抽象类有一个实现了WindowImpl接口的实例变量,并且有一个draw方法,该方法将调用WindowImpl的draw方法。Os抽象类也有一个实现了WindowImpl接口的实例变量,并且有一个drawWindow方法,该方法将创建一个Window对象,并调用draw方法。LinuxOs和WindowsOs类分别是Linux和Windows操作系统的实现,它们都是Os抽象类的子类。它们实现了createWindow方法,并返回一个具体的Window对象。

优缺点

优点:

  1. 桥接模式可以将抽象部分和实现部分分离,使它们可以独立变化,从而达到灵活性和可扩展性的目的。
  2. 桥接模式可以让客户端代码仅关注抽象部分,而不必关注实现部分的细节
  3. 桥接模式可以减少继承的使用,因为继承是一种静态的方式,而桥接模式则是一种动态的方式。

缺点:

  1. 桥接模式需要增加额外的抽象和实现层次,从而增加系统的复杂度和理解难度。
  2. 桥接模式需要对系统进行重新设计,从而增加了开发的时间和成本。

运用场景:

桥接模式适用于以下情况:

  1. 当一个类存在两个独立变化的维度时,可以使用桥接模式来将它们解耦,从而使它们可以独立变化。
  2. 当一个类需要在运行时切换不同的实现时,可以使用桥接模式来实现这一需求。
  3. 当一个类的抽象和实现部分可以分别扩展时,可以使用桥接模式来实现这一需求。

总结

总的来说,桥接模式是一种结构性设计模式,它可以将抽象部分和实现部分解耦,从而使它们可以独立变化而不会互相影响。Java作为一门面向对象的编程语言,非常适合使用桥接模式来实现复杂的软件系统。

标签:Java,color,桥接,int,Window,WindowImpl,设计模式,impl
From: https://www.cnblogs.com/xstxjs/p/17402932.html

相关文章

  • JAVA反序列化-URLDNS分析
    目录0x01URLDNS0x02利用链分析本文基于P大的《java安全漫谈》环境jdk1.7urldns是学习JAVA反序列化的入门利用链0x01URLDNSURLDNS就是ysoserial中⼀个利⽤链的名字,但准确来说,这个其实不能称作“利⽤链”。因为其参数不是⼀个可以“利⽤”的命令,⽽仅为⼀个URL,其能触发的结......
  • 给定一个字符串,用java代码找出其中不含有重复字符的最长子串的长度
    publicintlengthOfLongestSubstring(Strings){intn=s.length(),ans=0;Map<Character,Integer>map=newHashMap<>();for(inti=0,j=0;j<n;j++){if(map.containsKey(s.charAt(j))){i=Math.ma......
  • Java并发(六)----线程start、run、state方法
    1、start与run调用runpublicstaticvoidmain(String[]args){  Threadt1=newThread("t1"){    @Override    publicvoidrun(){      log.debug(Thread.currentThread().getName());//打印线程名称      FileRe......
  • Java并发(五)----线程常见方法总结
    常见方法方法名static功能说明注意start() 启动一个新线程,在新的线程运行run方法中的代码start方法只是让线程进入就绪,里面代码不一定立刻运行(CPU的时间片还没分给它)。每个线程对象的start方法只能调用一次,如果调用了多次会出现IllegalThreadStateException......
  • django系列-起源&MTV设计模式
    一、django起源Django是一个开放源代码的Web应用框架,使用Python语言编写完成。由于Python语言是跨平台的,所以,不论操作系统是Windows、Linux还是macOSX,都可以开发Django应用。Web框架是一套组件,提供通用的设计模式,能够最大程度地降低开发Web站点的难度。Django的设计目标就是使开......
  • 4、HDFS-java操作类HDFSUtil及junit测试(HDFS的常见操作以及HA环境的配置)
    目录Hadoop系列文章目录一、pom.xml二、junit测试类三、操作类(帮助类)四、高可用环境的操作类本文编写了java对HDFS的常见操作,并且均测试通过。其功能包含构造conf、设置系统环境变量、创建目录、判断文件是否存在、获取文件/目录的大小等,具体见下图。本文分为四部分,即pom.xml、ju......
  • 5、zookeeper的java -Curator(服务注册与发现)
    目录Zookeeper系列文章目录一、知识介绍1、ServiceInstance2、ServiceProvider3、ServiceDiscovery1)、注册/注销服务2)、查询服务3)、服务缓存二、示例11、pom.xml2、ServiceInstance3、ServiceProvider及ServiceDiscovery4、注册服务的添加、删除、查询5、验证示例1三、示例21、Ins......
  • 4、zookeeper的java三种客户端介绍-Curator(crud、事务操作、监听、分布式计数器、分布
    目录Zookeeper系列文章目录一、zookeeper原生JavaAPI二、ZkClient三、Apachecurator1、pom.xml2、定义常量类3、连接实例化4、事务操作示例5、CRUD示例6、监听示例7、计数器示例1)、单机原子自增性实现1、Synchronized示例2、Lock示例3、AtomicInteger示例2)、分布式线程安全原子......
  • java数组去重_JAVA数组去重常用方法
    java数组去重_JAVA数组去重常用方法发布于 2022-09-1017:18:356950举报大家好,又见面了,我是你们的朋友全栈君。packagecom.zxj.test;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.HashMap;importjava.util.List;importjava.util.......
  • Java对象和json对象
    java对象和json对象转换接口classPersion1{@SerializedName("name")@ExposeStringname;publicvoidsetName(Stringname){this.name=name;}@OverridepublicStringtoString()......