java 디자인 모드의 장식 모드 (decorator)
설명:
장식 모드는 원본 파일을 바꾸거나 계승을 사용할 필요가 없는 상황에서 동적으로 대상을 확장하는 기능이다.그것은 포장 대상, 즉 장식을 통해 진실을 감싸는 대상을 만든다.
장식 모델의 특징;
(1) 장식 대상과 실제 대상은 같은 인터페이스를 가진다.이렇게 하면 클라이언트 대상은 실제 대상과 같은 방식으로 장식 대상과 상호작용할 수 있다.
(2) 장식 대상은 실제 대상의 색인을 포함한다(reference)
(3) 장식 대상은 클라이언트로부터 모든 요청을 받아들인다.그것은 이 요청들을 실제 대상에게 전달한다.
(4) 장식 대상은 이러한 요청을 전달하기 전이나 이후에 추가 기능을 추가할 수 있다.이렇게 하면 운행 시 주어진 대상의 구조를 수정하지 않아도 외부에 추가 기능을 추가할 수 있다.대상을 대상으로 하는 디자인에서 일반적으로 계승을 통해 주어진 클래스에 대한 기능 확장을 실현한다.
다음 표에서는 장식 모드와 상속의 차이점을 보여 줍니다.
장식 모드 VS 계승
장식 모드 계승
특정 대상을 확장하는 기능
하위 클래스 필요 없어 하위 클래스 필요
동적
실행 시 직책 분배 컴파일 시 직책 분배
자류로 인한 복잡함과 혼란으로 인해 많은 자류가 발생하는 것을 방지하고, 일부 장소에서는 누락류의 차원을 보고한다.
유연성 향상 유연성 부족
주어진 대상에 대해 서로 다른 장식 대상이 있을 수 있으므로 클라이언트는 필요에 따라 적당한 장식 대상을 선택하여 메시지를 보낼 수 있다.모든 가능한 연합에 대해 고객의 기대
어떤 어려움도 증가시키기 쉽다
예:
Component( --- )
package com.dylan.gof.pattern.decorator;
/**
* Generated by StarUML(tm) Java Add-In
* @ Project : Untitled
* @ File Name : Decorator.java
* @ Date : 2011-2-16
* @ Author : Dylan
*
* @desc:
* :
* , , 。
*/
public interface Component {
public void go();
}
( . ,
package com.dylan.gof.pattern.decorator;
/**
* Generated by StarUML(tm) Java Add-In
* @ Project : Untitled
* @ File Name : Decorator.java
* @ Date : 2011-2-16
* @ Author : Dylan
*
* @desc:
* :
* . ,
*/
public class ConcreteComponent implements Component {
public void go() {
System.out.println(" ");
}
}
: , , , ,
* , Component , Component,
* 。
package com.dylan.gof.pattern.decorator;
/**
* Generated by StarUML(tm) Java Add-In
* @ Project : Untitled
* @ File Name : Decorator.java
* @ Date : 2011-2-16
* @ Author : Dylan
*
* @describle
* : , , , ,
* , Component , Component,
* 。
*/
public class Decorator implements Component {
public Component component;
protected Decorator(Component component) {
this.component = component;
}
public void go() {
this.component.go();
}
}
( , + s)
package com.dylan.gof.pattern.decorator;
/**
* Generated by StarUML(tm) Java Add-In
* @ Project : Untitled
* @ File Name : Decorator.java
* @ Date : 2011-2-16
* @ Author : Dylan
*
* @desc
* ( , + s)
*/
//
public class ConcreteDecoratorSing extends Decorator {
protected ConcreteDecoratorSing(Component component) {
super(component);
// code is here
}
public void go() {
listen(" ");//
super.go();
}
private void listen(Object obj) {
System.out.println(obj);
}
}
package com.dylan.gof.pattern.decorator;
/**
* Generated by StarUML(tm) Java Add-In
* @ Project : Untitled
* @ File Name : Decorator.java
* @ Date : 2011-2-16
* @ Author : Dylan
*/
// ( , + s)
// , Component
public class ConcreteDecoratorListenDump extends Decorator {
protected ConcreteDecoratorListenDump(Component component) {
super(component);
// code is here
}
public void go() {
component.go();
System.out.println(dump());
//
}
private String dump() {
return " ";
}
}
package com.dylan.gof.pattern.decorator;
/**
* Generated by StarUML(tm) Java Add-In
* @ Project : Untitled
* @ File Name : Decorator.java
* @ Date : 2011-2-16
* @ Author : Dylan
*/
// ( , + s)
// , Component
public class ConcreteDecoratorListen extends Decorator {
protected ConcreteDecoratorListen(Component component) {
super(component);
// code is here
}
public void go() {
component.go();
System.out.println(sing());
//
}
private String sing() {
return " ";
}
}
package com.dylan.gof.pattern.decorator;
/**
* Generated by StarUML(tm) Java Add-In
* @ Project : Untitled
* @ File Name : Decorator.java
* @ Date : 2011-2-16
* @ Author : Dylan
*/
public class Client {
public static void main(String[] args) {
Component component = new ConcreteComponent();
ConcreteDecoratorListen cdl = new ConcreteDecoratorListen(component);
cdl.go();
System.out.println();
Component cds = new ConcreteDecoratorSing(component);
cds.go();
System.out.println();
Component dump=new ConcreteDecoratorListenDump(cdl);
dump.go();
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.