>  기사  >  Java  >  Java 디자인 패턴의 모양 패턴 및 데코레이터 패턴 소개(코드 예)

Java 디자인 패턴의 모양 패턴 및 데코레이터 패턴 소개(코드 예)

不言
不言원래의
2018-09-12 16:06:231934검색

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

서문

이전 글에서 구조 패턴의 어댑터 패턴과 브릿지 패턴에 대해 알아보았습니다. 이번 글에서는 구조 모드의 Appearance 모드와 Decorator 모드에 대해 알아보겠습니다.

외관 모드

소개

외관 모드는 시스템의 복잡성을 숨기고 클라이언트가 시스템에 액세스할 수 있는 인터페이스를 제공합니다. 이러한 유형의 디자인 패턴은 시스템의 복잡성을 숨기기 위해 기존 시스템에 인터페이스를 추가하는 구조적 패턴입니다.

간단히 말하면 외부 세계에 대한 간단한 인터페이스를 제공하고 구현 로직을 숨깁니다. 예를 들어, 일반적으로 사용되는 컴퓨터의 전원 버튼은 전원 버튼만 누르면 컴퓨터를 시작하거나 종료할 수 있으므로 컴퓨터가 어떻게 시작되는지(CPU 시작, 메모리 시작, 하드 디스크 시작) 알 필요가 없습니다. ) 또는 종료 방법(하드 디스크 끄기, 메모리 끄기, CPU 끄기)

여기에서는 간단한 설명을 위해 컴퓨터에서 게임을 하는 표시 모드의 예를 사용할 수 있습니다.
컴퓨터에는 DNF, LOL, WOW 등 일부 온라인 게임이 있습니다. 게임을 시작하고 실행하려면 컴퓨터에서 아이콘을 두 번 클릭하기만 하면 됩니다.

구현해야 하는 단계는 다음과 같습니다.

  1. 게임 인터페이스를 설정합니다.

  2. LOL, DNF 및 WOW 클래스를 설정하고 게임 인터페이스를 구현합니다.

  3. 제공할 모양 클래스를 정의합니다. 클라이언트 호출.

  4. 외모반을 불러주세요.

코드 예:

interface Game{
    void play();
}

class DNF implements Game{

    @Override
    public void play() {
        System.out.println("正在玩DNF...");
    }
}

class LOL implements Game{
    @Override
    public void play() {
        System.out.println("正在玩LOL...");
    }
}

class WOW implements Game{
    @Override
    public void play() {
        System.out.println("正在玩WOW...");
    }
}

class Computer{
    
    private Game dnf;
    private Game lol;
    private Game wow;
    
    public Computer() {
        dnf=new DNF();
        lol=new LOL();
        wow=new WOW();
    }
    
    public void playDNF(){
        dnf.play();
    }
    
    public void playLOL(){
        lol.play();
    }
    
    public void playWOW(){
        wow.play();
    }   
}

public static void main(String[] args) {
        Computer computer=new Computer();
        computer.playDNF();
        computer.playLOL();
        computer.playWOW();
    }

실행 결과:

    正在玩DNF...
    正在玩LOL...
    正在玩WOW...

위의 코드 예에서 게임을 플레이하려면 appearance 클래스를 인스턴스화하고 게임 메소드를 호출하기만 하면 됩니다. 게임이 어떻게 시작되고 실행되는지 걱정할 필요가 없습니다. 또한 각 게임은 서로 독립적이며 서로 영향을 미치지 않습니다. 한 게임을 실행할 수 없으므로 다른 게임을 실행할 수 없습니다. 사실, 외관 모드는 우리가 일반적으로 사용하는 인터페이스와 매우 유사하다고 생각합니다. 둘 다 외부 세계에 대한 인터페이스를 제공하므로 구현 방법에 신경 쓸 필요가 없습니다.

표시 모드의 장점:

결합을 줄여 어떤 면에서는 보안도 향상시킵니다.

외형모드의 단점:

개폐원칙을 준수하지 않으며 변경이 쉽지 않습니다.

사용 시나리오

시스템에 여러 개의 복잡한 모듈이나 하위 시스템이 있는 경우.

데코레이터 패턴

소개

데코레이터 패턴을 사용하면 구조를 변경하지 않고도 기존 객체에 새로운 기능을 추가할 수 있습니다. 이러한 유형의 디자인 패턴은 기존 클래스를 감싸는 래퍼 역할을 하는 구조적 패턴입니다.

데코레이터 모드는 이름에서 알 수 있듯이 추가 기능을 제공할 수 있도록 무언가를 장식하는 것입니다. 예를 들어, 사람을 꾸미고 다른 일을 할 때 다른 의상을 입는 것입니다. 예를 들어 저지를 입는다는 것은 공놀이를 할 준비를 한다는 것을 의미하고, 수영복을 입는다는 것은 수영하러 갈 준비를 한다는 것을 의미합니다.

데코레이터 패턴은 객체에 몇 가지 추가 책임을 동적으로 추가할 수 있습니다.

여기에서는 설명을 위해 예를 사용합니다.
현재 장난감 모델 중에는 GUNDAM 모델MrGu 모델 두 가지가 있습니다. 모델을 조립할 때 일반적으로 모델을 먼저 조립한 다음 무기와 같은 추가 액세서리를 추가합니다. 여기서는 건담 모델자쿠(MrGu) 모델을 조립한 다음 각각의 무기를 장착했습니다.

구체적인 구현 단계는 다음과 같습니다.

  1. 조립 방법을 사용하여 추상 구성 요소에 대한 모델 인터페이스를 생성합니다.

  2. 특정 구성 요소에 대한 클래스(GUNDAM 클래스 및 MrGu 클래스)를 생성하고 위의 모델 인터페이스를 구현합니다.

  3. 클라이언트의 요청을 수락하고 클라이언트의 요청에 따라 해당 호출을 수행하는 데코레이터를 정의합니다.

  4. 해당 기능을 개체에 추가하기 위해 데코레이션을 구체적으로 구현하는 클래스를 정의합니다.

코드 예:

interface Model{
    void  assemble();
}

class GUNDAM implements Model{
    @Override
    public void  assemble() {
        System.out.println("组装一个高达模型");
    }
}

class MrGu implements Model{
    @Override
    public void  assemble() {
        System.out.println("组装一个扎古模型");
    }
}

abstract class  AddExtra implements Model{
    protected  Model model;
    
    public AddExtra(Model model){
        this.model=model;
    }
    public  void assemble(){
        model.assemble();
    }
}

class LightSaber extends AddExtra{

    public LightSaber(Model model) {
        super(model);
    }
    
    public  void assemble(){
        model.assemble();
        addLightSaber();
    }
    public void addLightSaber(){
        System.out.println("添加光剑");
    }
}


class RocketLauncher extends AddExtra{

    public RocketLauncher(Model model) {
        super(model);
    }
    
    public  void assemble(){
        model.assemble();
        addRocketLauncher();
    }
    public void addRocketLauncher(){
        System.out.println("添加火箭筒");
    }
}

public static void main(String[] args) {
    
        Model gundam=new GUNDAM();
        Model mrgu=new MrGu();
        gundam.assemble();
        mrgu.assemble();
            
        Model gModel=new LightSaber(new GUNDAM());
        gModel.assemble();
        Model mModel=new RocketLauncher(new MrGu());
        mModel.assemble();
}

실행 결과:

    组装一个高达模型
    组装一个扎古模型
    
    组装一个高达模型
    添加光剑
    组装一个扎古模型
    添加火箭筒

위 코드에서 건담이나 자쿠의 모델만 조립하려는 경우 모델 클래스를 직접 인스턴스화하고 그 안에 있는 메서드를 호출할 수 있습니다. 할 수 있다. 모델을 조립할 때 무기를 추가해야 하는 경우 데코레이터 클래스를 통해 해당 기능을 추가하기만 하면 됩니다.
이 예제를 통해 데코레이터 패턴을 사용하려고 할 때 일부 클래스는 이전 기능에 영향을 주지 않고 확장되어 유연성이 향상된다는 것을 발견했습니다.

데코레이터 패턴의 장점:

데코레이팅 클래스와 데코레이팅 클래스는 독립적으로 개발할 수 있으며 낮은 결합도, 쉬운 확장성, 유연성 및 편의성을 제공합니다.

데코레이터 패턴의 단점:

클래스를 너무 많이 장식하면 복잡성이 증가합니다.

사용 시나리오
프로토타입이 변경되지 않고 일부 기능이 동적으로 추가되는 경우.

관련 권장 사항:

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

Java 디자인 패턴의 빌더 패턴 및 프로토타입 패턴 소개(코드 예)

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

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