>  기사  >  Java  >  Java 디자인 패턴의 브리지 모드에 대한 자세한 설명

Java 디자인 패턴의 브리지 모드에 대한 자세한 설명

黄舟
黄舟원래의
2017-09-22 11:22:211401검색

이 글은 주로 Java 디자인 패턴의 브리징 모드를 소개하고 있으며 브리징 모드의 개념, 기능, Java 구현 방법 및 관련 주의 사항을 예제 형식으로 자세히 분석합니다.

이 글에서는 예제가 포함된 Java 디자인 패턴입니다. 다음과 같이 참조할 수 있도록 모든 사람과 공유하세요.

개념:

브릿지 패턴: 추상적인 부분을 구현 부분과 분리하여 독립적으로 변경할 수 있습니다.

브리지 모드는 상속 관계를 연관 관계로 변환하여 클래스 간의 결합을 줄이고 코드 작성 양을 줄입니다.

브릿지 모드는 언제 사용하나요?

간단히 말하면, 사물의 특징을 추상화할 때, 사물의 특징적인 속성은 매우 추상적이어서, 속성을 다시 추상화해야 합니다.

그렇지 않으면 특정 하위 클래스의 수가 기하학적으로 늘어나 확장이 어려워집니다. 기존 코드를 유지할 방법이 없습니다.

예를 들어 휴대폰이라는 두 개체를 추상화하면 운영 체제, CPU, 화면, 통신사 네트워크 등과 같은 여러 속성이 매우 복잡합니다. 이러한 속성은 단순히 직접 정의할 수 없으며 다시 추상화해야 합니다. 특정 휴대폰 객체는 이러한 속성들의 조합이지만, 이는 단순한 조합이 아니며, 속성들은 자신의 기능을 속성으로 구현해야 합니다. 이러한 설계에서는 코드 유지 관리 및 확장이 더 쉬워집니다.

참고: 이 모델에 대해 이야기할 때 제가 말하고 쓴 예가 정확하다고 보장할 수는 없습니다. 따라서 모든 예는 개인적인 이해를 바탕으로 한 것입니다.

제가 생각하는 브릿지 모드 설명도:

다음은 예시입니다.

1 먼저 추상 클래스를 정의하고, 객체의 특성을 추상화합니다.

향후 연결 및 확장을 위해 개체의 속성에 대한 차원을 나눕니다.


package test.design.bridge;
public abstract class CellPhone {
  private String cellPhoneName;
  public CellPhoneSystem cellPhoneSystem;
  public CellPhoneCPU cellPhoneCPU;
  public void works(){
    System.out.println("---------------------");
    System.out.println("This cellphone is:"+this.getCellPhoneName()+",welcome to use. ");
    System.out.println("This cellphone detail infomation:");
    System.out.println("系统类型:"+this.getCellPhoneSystem().getSystemName());
    System.out.println("cpu型号:"+this.getCellPhoneCPU().getCpuName());
    System.out.println("---------------------");
  }
  public String getCellPhoneName() {
    return cellPhoneName;
  }
  public void setCellPhoneName(String cellPhoneName) {
    this.cellPhoneName = cellPhoneName;
  }
  public CellPhoneSystem getCellPhoneSystem() {
    return cellPhoneSystem;
  }
  public void setCellPhoneSystem(CellPhoneSystem cellPhoneSystem) {
    this.cellPhoneSystem = cellPhoneSystem;
  }
  public CellPhoneCPU getCellPhoneCPU() {
    return cellPhoneCPU;
  }
  public void setCellPhoneCPU(CellPhoneCPU cellPhoneCPU) {
    this.cellPhoneCPU = cellPhoneCPU;
  }
}

2. 속성 차원의 추상화. (인터페이스 정의를 사용할 수 있으며 키는 특정 기능에 따라 다릅니다.)


package test.design.bridge;
/**
 * 属性cpu被抽象成一个维度,为了以后扩展
 * @author lushuaiyin
 *
 */
public abstract class CellPhoneCPU {
  public CellPhone cellPhone;
  public String cpuName;
  public void cpuWorks(){
    System.out.println("I am cpu. My pattern is:"+this.getCpuName());
    System.out.println("I am working for this cellphone:"+this.getCellPhone().getCellPhoneName());
  }
  public CellPhone getCellPhone() {
    return cellPhone;
  }
  public void setCellPhone(CellPhone cellPhone) {
    this.cellPhone = cellPhone;
    this.getCellPhone().setCellPhoneCPU(this);// 装配(桥接,或者可以认为对象类与其属性类的传递)
  }
  public String getCpuName() {
    return cpuName;
  }
  public void setCpuName(String cpuName) {
    this.cpuName = cpuName;
  }
}


package test.design.bridge;
/**
 * 属性操作系统被抽象成一个维度,为了以后扩展
 * @author lushuaiyin
 *
 */
public abstract class CellPhoneSystem {
  public CellPhone cellPhone;
  public String SystemName;
  public void systemWorks(){
    System.out.println("I am "+this.getSystemName()+" system.");
    System.out.println("I am working for this cellphone:"+this.getCellPhone().getCellPhoneName());
  }
  public CellPhone getCellPhone() {
    return cellPhone;
  }
  public void setCellPhone(CellPhone cellPhone) {
    this.cellPhone = cellPhone;
    this.getCellPhone().setCellPhoneSystem(this);// 装配(桥接,或者可以认为对象类与其属性类的传递)
  }
  public String getSystemName() {
    return SystemName;
  }
  public void setSystemName(String systemName) {
    SystemName = systemName;
  }
}

3. 특정 차원 속성 객체.

여기서 운영 체제 속성과 CPU 속성에 각각 2개의 특정 객체를 정의합니다.


package test.design.bridge;
public class AndroidSystem extends CellPhoneSystem{
}


package test.design.bridge;
public class IOSSystem extends CellPhoneSystem{
}


package test.design.bridge;
/**
 * 双核cpu
 * @author Administrator
 *
 */
public class TwoCore extends CellPhoneCPU{
}


package test.design.bridge;
/**
 * 四核cpu
 * @author Administrator
 *
 */
public class FourCore extends CellPhoneCPU{
}

4. 테스트 코드.

차원을 확장해야 할 때 차원을 확장하는 방법에 대해 이야기합니다.

휴대폰 개체 정의


package test.design.bridge;
public class Phone1 extends CellPhone{
  //具体对象的属性与逻辑
}

주요 기능 테스트


package test.design.bridge;
public class TestMain {
  /**
   * @param args
   */
  public static void main(String[] args) {
    //任何一种具体的对象都是复杂多种属性的集合,在此可以看出桥接模式在构建对象时的灵活性
    //产生一个具体对象1
    CellPhone p1=new Phone1();
    p1.setCellPhoneName(" IPhone 6 ");
    CellPhoneSystem system1=new IOSSystem();//操作系统属性维度
    system1.setSystemName("ios7");
    system1.setCellPhone(p1);//装配
    system1.systemWorks();//工作
    /*装配说的简单点就是传值。因为我们把一个对象的属性按维度分开来了,
     那么桥接的时候就必须相互传递对象。即对象类可以调用子属相类对象,
     子属性类对象也可以调用该对象类.
     关于这样的传值方式有多种,你可以在构造函数中传递,也可以在
    调用具体逻辑方法时传递。这里我直接用set方法传递,只是为了更清楚.
    如果某个属性维度是必须出现的,那就可以在抽象类的构造函数中传入*/
    CellPhoneCPU cpu1=new TwoCore();//cpu属性维度
    cpu1.setCpuName("A6");
    cpu1.setCellPhone(p1);
    cpu1.cpuWorks();
    p1.works();//最终整体对象功能
    /*
    桥接模式就是为了应对属性的扩展,在此说的属性必须是在维度确定的情况下。
    比如,这里我们在定义手机对象时,确定两个属性维度:操作系统和cpu型号。
    以后再这两个属性中,需要扩展时,就可以使用该模式。比如,一种新的cpu
    型号出现了,那么我不用重新设计现在的代码,只要增添一个cpu类即可。
    如果出现了新的维度属性,比如手机对象必须考虑屏幕大小。那桥接模式
    在此就需要从根本上修改代码来了。
    */
    System.out.println("-----------分割---------------------------");
    //在cpu维度上扩展。比如出现新型cpu:8核三星Exynos 5 Octa芯片".
    //三星手机推出了GALAXY Note Ⅲ就是使用这种新型cpu. 写一个新类EightCore扩展cpu维度.
    //同时定义这个手机对象GALAXY Note Ⅲ为PhoneGalaxyNote3
    CellPhone note3=new PhoneGalaxyNote3();
    note3.setCellPhoneName("GALAXY Note Ⅲ");
    CellPhoneSystem system2=new AndroidSystem();
    system2.setSystemName("android4");
    system2.setCellPhone(note3);//装配
    system2.systemWorks();//工作
    CellPhoneCPU cpu2=new EightCore();//最新8核cpu
    cpu2.setCpuName("三星Exynos 5 Octa芯片");
    cpu2.setCellPhone(note3);
    cpu2.cpuWorks();
    note3.works();//三星GALAXY Note Ⅲ新体验
  }
}

확장해야 하는 경우 새 차원 속성 정의


package test.design.bridge;
public class EightCore extends CellPhoneCPU {
}


package test.design.bridge;
public class PhoneGalaxyNote3 extends CellPhone{
  //具体对象的属性与逻辑
}

테스트 인쇄;


아아아아

위 내용은 Java 디자인 패턴의 브리지 모드에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.