>Java >java지도 시간 >Java의 데코레이터 패턴 예제에 대한 자세한 설명

Java의 데코레이터 패턴 예제에 대한 자세한 설명

黄舟
黄舟원래의
2017-09-05 10:27:311561검색

이 글은 주로 자바 데코레이터 패턴을 소개하고, 데코레이터 패턴의 원리와 자바 특유의 구현 기법을 예제 형식으로 자세히 분석하고 있습니다. 도움이 필요한 친구들이 참고할 수 있습니다.

이 글은 자바 데코레이터 패턴을 예시로 설명합니다. 참조용으로 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다.

장식 모드

원본 클래스 파일을 변경하거나 상속을 사용하지 않고 객체의 기능을 동적으로 확장합니다. 감싸는 오브제, 즉 장식물을 생성하여 실제 오브제를 감싸는 것이다.

장식된 개체는 클라이언트의 모든 요청을 받아들입니다. 이러한 요청을 실제 객체로 전달합니다. 장식된 개체는 이러한 요청을 전달하기 전이나 후에 추가 기능을 추가할 수 있습니다.

이렇게 하면 특정 개체의 구조를 수정하지 않고도 런타임 시 외부에서 추가 기능을 추가할 수 있습니다. 객체 지향 설계에서 특정 클래스의 기능 확장은 일반적으로 상속을 통해 구현됩니다.

장점

1. Decorator 모드와 상속 관계의 목적은 객체의 기능을 확장하는 것이지만 Decorator 모드는 상속보다 더 많은 유연성을 제공할 수 있습니다.

2. 다양한 특정 데코레이션 클래스와 이러한 데코레이션 클래스의 배열 및 조합을 사용하여 디자이너는 다양한 동작의 다양한 조합을 만들 수 있습니다.

Role

데코레이션 모드의 다양한 역할은 다음과 같습니다.

(1) 추상 컴포넌트(Component) 역할: 추가 책임을 받을 준비가 된 객체를 표준화하기 위한 추상 인터페이스를 제공합니다.
(2) 구체적인 구성 요소 역할: 추가 책임을 맡을 클래스를 정의합니다.
(3) 데코레이터 역할: 구성 요소 개체의 인스턴스를 보유하고 추상 구성 요소 인터페이스와 일치하는 인터페이스를 구현합니다.
(4) 콘크리트 데코레이터 역할: 구성 요소 개체에 추가 책임을 추가하는 역할을 담당합니다.

예제 코드

핸드 케이크를 예로 들어보겠습니다. 핸드 케이크는 다양한 맛이 있을 수 있지만, 가장 기본적인 것은 오리지널 핸드 케이크입니다. 또는 고기와 같은 더 많은 조합.

추상 컴포넌트 역할


package 装饰者模式;
/**
 * 抽象类接口,规范饼的属性
 * @author oooo
 *
 */
public interface Cake {
//两个属性
  public String descripestion();
//属性描述
  public Double money();
//价格描述
}

콘크리트 컴포넌트 역할


package 装饰者模式;
/**
 * 原味手抓饼类
 * @author oooo
 *负责接收附加属性的类
 */
public class shreddedcake implements Cake{
//实现Cake接口
  @Override
  public String descripestion() {
    //描述属性
    return "原味手抓饼";
  }
  @Override
  public Double money() {
     //描述价格
    return 3.5;
  }
}

데코레이터 역할


package 装饰者模式;
/**
 * 建立和饼的连接,得到原始饼的属性,添加属性的中介。
 * @author oooo
 *
 */
public abstract class Deractor implements Cake{
  Cake cake;
  public Deractor(Cake cake) {
    this.cake=cake;
  }
  public String descripestion(){
    return cake.descripestion();
  }
  public Double money(){
    return cake.money();
  }
}

콘크리트 데코레이터 역할


package 装饰者模式;
/**
 * 鸡蛋手抓饼类
 * @author oooo
 *添加鸡蛋属性
 */
public class EggshrededCake extends Deractor{
  public EggshrededCake(Cake cake) {
    super(cake);
  }
  public String descripestion() {
    return "鸡蛋"+cake.descripestion();
  }
  @Override
  public Double money() {
    return 3.5+1.5;
  }
}

콘크리트 데코레이터 역할


package 装饰者模式;
/**
 * 牛肉味手抓饼
 * @author oooo
 *添加牛肉属性
 */
public class beffshredded extends Deractor{
  public beffshredded(Cake cake) {
    super(cake);
    // TODO Auto-generated constructor stub
  }
  public String descripestion() {
    return "牛肉"+cake.descripestion();
  }
  @Override
  public Double money() {
    return cake.money()+3.0;
  }
}

테스트 수업


package 装饰者模式;
public class Test {
  /**
   * 测试类
   * @param args
   */
  public static void main(String[] args) {
    //新建一个原味手抓饼类
    shreddedcake sh=new shreddedcake();
    System.out.println(sh.descripestion());
    System.out.print("  价格: "+sh.money());
    //新建一个鸡蛋类,附加鸡蛋属性到手抓饼上
    EggshrededCake egg=new EggshrededCake(sh);
    System.out.println(egg.descripestion());
    System.out.print("  价格:"+egg.money());
    //新建一个牛肉类,附加牛肉属性到手抓饼上
    beffshredded beff=new beffshredded(egg);
    System.out.println(beff.descripestion());
    System.out.print("  价格:"+beff.money());
  }
}

출력 결과:


原味手抓饼  价格: 3.5
鸡蛋原味手抓饼  价格:5.0
牛肉鸡蛋原味手抓饼  价格:8.0

위 내용은 Java의 데코레이터 패턴 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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