From dd6278f45552f70f428da8949e4a4bdcf845fbe0 Mon Sep 17 00:00:00 2001 From: Geonui Date: Wed, 6 Dec 2023 23:36:39 +0900 Subject: [PATCH] docs : Translate the Decorater to Korean --- localization/ko/decorater/README.md | 167 ++++++++++++++++++ .../ko/decorater/etc/decorator.urm.png | Bin 0 -> 23530 bytes 2 files changed, 167 insertions(+) create mode 100644 localization/ko/decorater/README.md create mode 100644 localization/ko/decorater/etc/decorator.urm.png diff --git a/localization/ko/decorater/README.md b/localization/ko/decorater/README.md new file mode 100644 index 000000000000..c68a6d1f99e6 --- /dev/null +++ b/localization/ko/decorater/README.md @@ -0,0 +1,167 @@ +--- +title: Decorator +category: Structural +language: en +tag: + - Gang of Four + - Extensibility +--- + +## ~로 알려져 있는 + +Wrapper + +## 의도 + +객체에 동적으로 추가적인 책임을 부여합니다. 데코레이터(Decorater)는 기능 확장을 위한 서브 클래스를 만드는 것의 +유연한 대안을 제공합니다. + +## 설명 + +실제 예제 + +> 근처 언덕에 성난 트롤이 살고 있습니다. 보통은 맨손으로 다니지만 가끔씩은 무기를 가지고 있습니다. +> 트롤을 무장시키기 위해 새로운 트롤을 만들 필요 없이 적절한 무기로 트롤을 장식(decorate)하면 됩니다. + +쉽게 설명하면 + +> 데코레이터(Decorator) 패턴은 객체를 데코레이터(Decorater) 클래스의 객체로 감싸 런타임 시, +> 객체의 동작을 동적으로 변경할 수 있도록 합니다. + +Wikipedia에 의하면 + +> 객체 지향 프로그래밍에서, 데코레이터(Decorater)은 다음과 같은 동작을 허용하는 디자인 패턴입니다. +> 정적, 동적 상관없이 개별 객체에 동작을 추가할 수 있는 디자인 패턴입니다. +> 동작에 영향을 주지 않고 개별 객체에 동작을 추가할 수 있는 디자인 패턴입니다. +> 데코레이터(Decorater) 패턴은 종종 단일 책임 원칙(SRP)을 준수하는데 유용합니다. +> 고유한 관심 영역을 가진 클래스 간에 기능을 나눌 수 있기 때문에 개방 폐쇄 원칙(OCP)를 준수하는데 유용합니다. +> 클래스의 기능을 수정하지 않고 확장할 수 있기 때문입니다. + +**프로그램 코드 예제** + +트롤을 예로 들어보겠습니다. 먼저, 'Troll' 인터페이스를 구현하는 'SimpleTroll'이 있습니다. + +```java +public interface Troll { + void attack(); + int getAttackPower(); + void fleeBattle(); +} + +@Slf4j +public class SimpleTroll implements Troll { + + @Override + public void attack() { + LOGGER.info("The troll tries to grab you!"); + } + + @Override + public int getAttackPower() { + return 10; + } + + @Override + public void fleeBattle() { + LOGGER.info("The troll shrieks in horror and runs away!"); + } +} +``` + +다음으로, 트롤을 위한 곤봉을 추가하겠습니다. 데코레이터(Decorater)를 사용해 동적으로 추가할 수 있습니다. + +```java +@Slf4j +public class ClubbedTroll implements Troll { + + private final Troll decorated; + + public ClubbedTroll(Troll decorated) { + this.decorated = decorated; + } + + @Override + public void attack() { + decorated.attack(); + LOGGER.info("The troll swings at you with a club!"); + } + + @Override + public int getAttackPower() { + return decorated.getAttackPower() + 10; + } + + @Override + public void fleeBattle() { + decorated.fleeBattle(); + } +} +``` + +트롤이 실제로 동작하는 모습입니다. + +```java +// simple troll +LOGGER.info("A simple looking troll approaches."); +var troll = new SimpleTroll(); +troll.attack(); +troll.fleeBattle(); +LOGGER.info("Simple troll power: {}.\n", troll.getAttackPower()); + +// change the behavior of the simple troll by adding a decorator +LOGGER.info("A troll with huge club surprises you."); +var clubbedTroll = new ClubbedTroll(troll); +clubbedTroll.attack(); +clubbedTroll.fleeBattle(); +LOGGER.info("Clubbed troll power: {}.\n", clubbedTroll.getAttackPower()); +``` + +프로그램 실행 결과: + +```java +A simple looking troll approaches. +The troll tries to grab you! +The troll shrieks in horror and runs away! +Simple troll power: 10. + +A troll with huge club surprises you. +The troll tries to grab you! +The troll swings at you with a club! +The troll shrieks in horror and runs away! +Clubbed troll power: 20. +``` + +## 클래스 다이어그램 + +![alt text](./etc/decorator.urm.png "Decorator pattern class diagram") + +## 적용 가능성 + +다음과 같은 경우 데코레이터(Decorator) 패턴을 사용합니다.: + +* 다른 객체에 영향을 주지 않으면서 개별 객체에 동적으로 투명하게 책임을 추가할 수 있습니다. +* 철회될 수 있는 책임들의 경우에 사용합니다. +* 서브클래스를 통한 확장이 실용적이지 않을 경우에 사용합니다. 때로 많은 수의 독립적인 확장은 모든 조합을 지원하기 위해 서브클래스가 폭발적으로 늘어날 수 있습니다. + 또는 클래스 정의가 숨겨져 있거나 서브클래스 생성이 불가능한 경우에 사용합니다. + +## 튜토리얼 + +* [Decorator Pattern Tutorial](https://www.journaldev.com/1540/decorator-design-pattern-in-java-example) + +## 실제 사례 + + * [java.io.InputStream](http://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html), [java.io.OutputStream](http://docs.oracle.com/javase/8/docs/api/java/io/OutputStream.html), + [java.io.Reader](http://docs.oracle.com/javase/8/docs/api/java/io/Reader.html), [java.io.Writer](http://docs.oracle.com/javase/8/docs/api/java/io/Writer.html) + * [java.util.Collections#synchronizedXXX()](http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#synchronizedCollection-java.util.Collection-) + * [java.util.Collections#unmodifiableXXX()](http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#unmodifiableCollection-java.util.Collection-) + * [java.util.Collections#checkedXXX()](http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#checkedCollection-java.util.Collection-java.lang.Class-) + + +## 크레딧 + +* [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59) +* [Functional Programming in Java: Harnessing the Power of Java 8 Lambda Expressions](https://www.amazon.com/gp/product/1937785467/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1937785467&linkCode=as2&tag=javadesignpat-20&linkId=7e4e2fb7a141631491534255252fd08b) +* [J2EE Design Patterns](https://www.amazon.com/gp/product/0596004273/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596004273&linkCode=as2&tag=javadesignpat-20&linkId=48d37c67fb3d845b802fa9b619ad8f31) +* [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b) +* [Refactoring to Patterns](https://www.amazon.com/gp/product/0321213351/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321213351&linkCode=as2&tag=javadesignpat-20&linkId=2a76fcb387234bc71b1c61150b3cc3a7) +* [J2EE Design Patterns](https://www.amazon.com/gp/product/0596004273/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596004273&linkCode=as2&tag=javadesignpat-20&linkId=f27d2644fbe5026ea448791a8ad09c94) diff --git a/localization/ko/decorater/etc/decorator.urm.png b/localization/ko/decorater/etc/decorator.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..141c0563f0c6c79c0fbeb125278dfbc151ffd6a0 GIT binary patch literal 23530 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 literal 0 HcmV?d00001