> Java > java지도 시간 > 본문

Java 디자인 패턴의 어댑터 패턴 및 브리지 패턴 소개(코드 예)

不言
풀어 주다: 2018-09-12 16:02:39
원래의
1745명이 탐색했습니다.

이 기사에서는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!