찾다
Javajava지도 시간Java 디자인 패턴의 어댑터 패턴 및 브리지 패턴 소개(코드 예)

이 기사에서는 Java 디자인 패턴(코드 예제)의 어댑터 모드와 브리지 모드에 대해 소개합니다. 필요한 친구가 참고할 수 있기를 바랍니다.

머리말

이전 글에서 우리는 크리에이티브 패턴의 빌더 패턴과 프로토타입 패턴에 대해 배웠습니다. 이번 글에서는 구조 모드의 어댑터 모드와 브리지 모드에 대해 알아보겠습니다.

어댑터 패턴

소개

어댑터 패턴은 호환되지 않는 두 인터페이스 사이의 브리지 역할을 합니다. 이러한 유형의 디자인 패턴은 두 개의 독립적인 인터페이스의 기능을 결합한 구조적 패턴입니다.

간단히 말하면, 호환되지 않는 두 클래스가 일반적으로 변환기라고 알려진 인터페이스를 통해 호환되게 됩니다.
생활 속의 대표적인 예가 가전제품의 전압입니다. 미국의 전압은 약 110V인 반면, 중국의 전압은 일반적으로 220V입니다. 미국이나 일본의 가전제품을 사용하려면 110V를 변환하는 변환기가 필요합니다. 220V로. 또 다른 대표적인 예로는 다양한 휴대폰 배터리를 기본적으로 충전할 수 있는 만능 충전기가 있다.

여기에서는 설명을 위해 간단한 예를 사용합니다.
특정 비디오 플레이어는 MP4 형식의 비디오만 재생할 수 있지만 MP4 외에도 주류 비디오 형식에는 AVI, RVMB 등이 포함됩니다. 현재 비디오 형식을 변환하는 데 사용되는 소프트웨어인 Format Factory가 있습니다( 어댑터)를 사용하여 비디오를 재생합니다. 이때 어댑터 패턴을 사용하여 코드 작성을 완료할 수 있습니다.

어댑터 패턴에는 크게 두 가지 유형이 있습니다. 하나는 주로 상속을 통해 어댑터 기능을 구현하는 클래스 어댑터 패턴이고, 다른 하나는 조합을 통해 어댑터 기능을 구현하는 객체 어댑터 패턴입니다.

첫 번째는 클래스 어댑터 패턴으로, 다음 단계를 완료해야 합니다.

  1. MP4, AVI, RVMB 비디오 형식에 대한 인터페이스를 설정합니다.

  2. MP4 비디오 형식을 구현하기 위한 비디오 플레이어 클래스를 만듭니다. class;

  3. AVI, RVMB 및 기타 형식의 비디오 파일을 MP4 형식 파일로 변환하는 형식 팩토리 클래스를 작성합니다.

  4. 이 동영상을 재생해 보세요.

다음 코드는 다음과 같습니다.

코드 예:

    interface Mp4{
        void playMp4();
    }
    
    interface Avi{
        void playAvi();
    }
    
    
    interface Rvmb{
        void playRvmb();
    }
    
    class VideoPlayer implements Mp4{
    
        @Override
        public void playMp4() {
            System.out.println("播放Mp4格式的视频文件.");
        }
    }
    
    
    class FormatFactory extends VideoPlayer  implements Avi{    
        @Override
        public void playAvi() {
            //转换成MP4格式的视频
            playMp4();
        }
    }
    
    
    public static void main(String[] args) {        
            Mp4 mp4=new VideoPlayer();
            mp4.playMp4();
            Avi avi=new FormatFactory();
            avi.playAvi();
    }

실행 결과:

    播放Mp4格式的视频文件.
    播放Mp4格式的视频文件.

위 코드와 실행 결과를 통해 새로운 비디오 형식이 있으면 원하는 결과를 얻을 수 있습니다. , 이 비디오 플레이어를 사용하여 재생해야 하는 경우 인터페이스를 추가하고 팩토리 클래스 형식을 지정하기만 하면 됩니다.

객체 어댑터 패턴
조합을 통해 어댑터 기능을 구현합니다.
여기서는 객체를 생성하기 위해 포맷 팩토리의 상속만 변경하면 됩니다.
변경 후 코드는 다음과 같습니다.
코드 예

class FormatFactory2  implements Rvmb{
        private Mp4 mp4;
        
         public FormatFactory2(Mp4 mp4) {
            this.mp4=mp4;
        }
        
        @Override
        public void playRvmb() {
            mp4.playMp4();
        }   
    }


    public static void main(String[] args) {
    
            Rvmb rvmb=new FormatFactory2(new VideoPlayer());
            rvmb.playRvmb();
            
    }

실행 결과:

    播放Mp4格式的视频文件.

두 어댑터 모드 모두 이 기능을 구현하지만 에 비해 객체 어댑터 모드를 사용하는 것이 좋습니다. 클래스 어댑터 패턴은 더 유연하며 디자인 원칙에서 구성 및 재사용 원칙을 따릅니다.

상속 대신 구성/집계를 사용해 보세요.

어댑터 패턴의 장점:

클래스 재사용 및 유연성이 향상됩니다.

어댑터 모드의 단점:

을 너무 많이 사용하면 시스템이 지저분해지고 익히기가 어려워집니다.

참고:

어댑터는 세부 설계 중에 추가되지 않지만 서비스 중인 프로젝트의 문제를 해결하기 위해 추가됩니다.

Bridge Mode

Introduction

Bridge는 추상화와 구현을 분리하여 두 가지가 독립적으로 변경될 수 있도록 하는 데 사용됩니다. 이러한 유형의 디자인 패턴은 추상화와 구현 사이에 브리징 구조를 제공하여 분리하는 구조적 패턴입니다.

직역적 해석은 중간에 있는 다리를 통해 양쪽에 있는 것을 연결하는 것이지만, 관련된 두 가지가 서로 영향을 미치지는 않습니다. 가장 인상 깊었던 것은 의 휴대폰 브랜드와 모바일 소프트웨어였습니다. 휴대폰 브랜드도 많고 시중에 나와 있는 소프트웨어도 각 휴대폰 브랜드에 따라 다릅니다. 소프트웨어는 휴대폰의 일부가 아니며 집합 관계입니다. A 브랜드 휴대폰에 소프트웨어 a와 b가 설치되어 있고, B 브랜드 휴대폰에 소프트웨어 b와 c가 설치되어 있는 경우, A 브랜드 휴대폰에 새로운 소프트웨어 c를 설치해야 한다면 어떻게 해야 할지 모르고 소프트웨어만 추가하면 됩니다. 소프트웨어가 생산됩니다. 마찬가지로, 새로운 C 브랜드 휴대폰을 추가하는 경우 필수 a, b 또는 c 소프트웨어만 설치하면 됩니다.

알겠습니다. 더 이상 말도 안 되는 소리는 하지 마세요. 예를 들어 설명해 보겠습니다.
시중에는 연필, 검은색 볼펜, 빨간색 볼펜 등 펜 종류가 많습니다. 시험지용 종이, 신문지 등 종이 종류도 많습니다. 일반적으로 신문에 적힌 글자의 색상은 검정색입니다. 여기서는 빨간색 볼펜을 사용하여 씁니다. 펜과 종이는 서로 독립적이지만 종이에 쓰는 것은 두 가지를 연관시킵니다. 여기서는 브리지 모드를 사용할 수 있습니다.

实现步骤如下:

  1. 定义一个笔类的接口,有写的这个方法;

  2. 定义红笔和黑笔的类,实现笔类的接口;

  3. 定义一个纸类的抽象类,设置笔的种类,并需要实现被写的方法;

  4. 定义卷子纸和新闻纸类,继承纸类并实现该方法;

  5. 进行书写。

代码示例

interface Pen{
    void write();
}

class RedPen implements Pen{
    @Override
    public void write() {
        System.out.println("红色的字");
    }
}

class BlackPen implements Pen{
    @Override
    public void write() {
        System.out.println("黑色的字");
    }
}


abstract class  Paper{
    protected  Pen pen;
    
    void setPen(Pen pen){
        this.pen=pen;
    }   
    abstract void writing();
}

class ExaminationPaper extends Paper{
    @Override
    void writing() {
        pen.write();
    }
}

class NewsPaper extends Paper{
    @Override
    void writing() {
        pen.write();
    }
}

public static void main(String[] args) {
        Paper paper=new ExaminationPaper();
        paper.setPen(new RedPen());
        paper.writing();
        
        Paper paper2=new NewsPaper();
        paper2.setPen(new BlackPen());
        paper2.writing();
    }

运行结果

红色的字
黑色的字

从上述结果中我们可以得出我们想要的结果。如果新增一个笔类或者一个纸类,那么只需新增相应的接口和实现即可,并不会因为结构化改变而相互直接影响。

桥接模式的优点:

1、抽象和实现的分离,实现了解耦;
2、提升的扩展能力。

桥接模式的缺点:

会使系统看起复杂,对新手不友好,没有一定的抽象进行设计能力难以理解。

使用场景:

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

相关推荐:

Java设计模式中建造者模式和原型模式的介绍(代码示例)

Java设计模式中工厂模式的介绍(代码示例)

위 내용은 Java 디자인 패턴의 어댑터 패턴 및 브리지 패턴 소개(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
Java 응용 프로그램에서 플랫폼 별 문제를 완화하기위한 몇 가지 전략은 무엇입니까?Java 응용 프로그램에서 플랫폼 별 문제를 완화하기위한 몇 가지 전략은 무엇입니까?May 01, 2025 am 12:20 AM

Java는 플랫폼 별 문제를 어떻게 완화합니까? Java는 JVM 및 표준 라이브러리를 통해 플랫폼 독립성을 구현합니다. 1) Bytecode 및 JVM을 사용하여 운영 체제 차이를 추상화합니다. 2) 표준 라이브러리는 Paths 클래스 처리 파일 경로 및 Charset 클래스 처리 문자 인코딩과 같은 크로스 플랫폼 API를 제공합니다. 3) 최적화 및 디버깅을 위해 실제 프로젝트에서 구성 파일 및 다중 플랫폼 테스트를 사용하십시오.

Java의 플랫폼 독립성과 마이크로 서비스 아키텍처의 관계는 무엇입니까?Java의 플랫폼 독립성과 마이크로 서비스 아키텍처의 관계는 무엇입니까?May 01, 2025 am 12:16 AM

java'splatformincendenceenhancesmicroservicesarchitectureDeploymentFlexibility, 일관성, 확장 성 및 포트 가능성

Graalvm은 Java의 플랫폼 독립 목표와 어떤 관련이 있습니까?Graalvm은 Java의 플랫폼 독립 목표와 어떤 관련이 있습니까?May 01, 2025 am 12:14 AM

Graalvm은 Java의 플랫폼 독립성을 세 가지 방식으로 향상시킵니다. 1. 교차 언어 상호 운용성, Java는 다른 언어와 원활하게 상호 작용할 수 있습니다. 2. 독립적 인 런타임 환경, Java 프로그램을 GraalvMnativeImage를 통해 로컬 실행 파일로 컴파일합니다. 3. 성능 최적화, Graal Compiler는 Java 프로그램의 성능과 일관성을 향상시키기 위해 효율적인 기계 코드를 생성합니다.

플랫폼 호환성을 위해 Java 응용 프로그램을 어떻게 테스트합니까?플랫폼 호환성을 위해 Java 응용 프로그램을 어떻게 테스트합니까?May 01, 2025 am 12:09 AM

ToEffectIallyTestJavaApplicationSforplatformcompatibility, followthesesteps : 1) setupAutomatedTestingAcrossMultiplePlatflatformsUsingCitools likeJenkinsorgitHubactions.2) 행동 관리자는 realHardwaretoCathissesnotfoundInvironmentments.3) Checkcross-Pla

플랫폼 독립성을 달성하는 데있어 Java Compiler (Javac)의 역할은 무엇입니까?플랫폼 독립성을 달성하는 데있어 Java Compiler (Javac)의 역할은 무엇입니까?May 01, 2025 am 12:06 AM

Java Compiler는 소스 코드를 플랫폼 독립적 인 바이트 코드로 변환하여 Java의 플랫폼 독립성을 실현하여 JVM이 설치된 JVM 프로그램에서 모든 운영 체제에서 실행할 수 있습니다.

플랫폼 독립성을 위해 기본 코드를 통해 바이트 코드를 사용하는 장점은 무엇입니까?플랫폼 독립성을 위해 기본 코드를 통해 바이트 코드를 사용하는 장점은 무엇입니까?Apr 30, 2025 am 12:24 AM

Bytecodeachievesplatformincendence는 executedbirtualmachine (vm)을 beenecutedbyavirtmachine (vm)을 허용합니다

Java는 진정으로 100% 플랫폼 독립적입니까? 왜 또는 왜 그렇지 않습니까?Java는 진정으로 100% 플랫폼 독립적입니까? 왜 또는 왜 그렇지 않습니까?Apr 30, 2025 am 12:18 AM

Java는 100% 플랫폼 독립성을 달성 할 수 없지만 플랫폼 독립성은 JVM 및 바이트 코드를 통해 구현되어 코드가 다른 플랫폼에서 실행되도록합니다. 특정 구현에는 다음이 포함됩니다. 1. 바이트 코드로의 컴파일; 2. JVM의 해석 및 실행; 3. 표준 라이브러리의 일관성. 그러나 JVM 구현 차이, 운영 체제 및 하드웨어 차이, 타사 라이브러리의 호환성은 플랫폼 독립성에 영향을 줄 수 있습니다.

Java의 플랫폼 독립성은 코드 유지 가능성을 어떻게 지원합니까?Java의 플랫폼 독립성은 코드 유지 가능성을 어떻게 지원합니까?Apr 30, 2025 am 12:15 AM

Java는 "Writ 2. 유지 보수 비용이 낮 으면 하나의 수정 만 필요합니다. 3. 높은 팀 협업 효율성은 높고 지식 공유에 편리합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.