반응형
When Using It

언어로 문제를 해결하기

Class Diagram



Sample Code



public interface AbstractExpression {

public void interprete(Context context);

}


public class TerminalExpression implements AbstractExpression {

@Override

public void interprete(Context context) {

String token = context.currentToken();

if (!"go".equals(token) ) {

new NonTerminalExpression().interprete(context);

} else {

System.out.println("go");

}

}

}


public class NonTerminalExpression implements AbstractExpression {

@Override

public void interprete(Context context) {

String token = context.currentToken();

if ( "begin".equals(token)) {

System.out.println("begin");

while ((token = context.nextToken()) != null ) 

{

new TerminalExpression().interprete(context);

}

} else if ( "end".equals(token)) {

System.out.println("end");

} else {

System.out.println("error");

}

}

}


public class Context {

private StringTokenizer tokenizer;

private String currentToken;

public Context(String text) {

tokenizer = new StringTokenizer(text);

this.nextToken();

}

public String nextToken() {

if (tokenizer.hasMoreTokens()) {

currentToken = tokenizer.nextToken();

} else {

currentToken = null;

}

return currentToken;

}

public String currentToken() {

return currentToken;

}

}


public class Client {

public static void main(String[] args) {

String text = "begin go go go end";

Context context = new Context(text);

NonTerminalExpression nonTerminalExpression = new NonTerminalExpression();

nonTerminalExpression.interprete(context);

}

}


Caution


특별한 주의사항은 없다. 
반응형
반응형
When Using It

명령을 클래스로 표현하고 싶을때

Class Diagram


Sample Code



public interface Command {

public void execute();

}



public class ConcreteCommand implements Command {

private Receiver receiver = new Receiver();

@Override

public void execute() {

receiver.action();

}

}


public class Receiver {

public void action() {

System.out.println("Action Performed!!!");

}

}


public class Invoker {

private List<Command> commands = new ArrayList<Command>();

public void addCommand(Command command) {

commands.add(command);

}

public void excute() {

for ( Command command : commands) {

command.execute();

}

}

}



public class Client {

public static void main(String[] args) {

Invoker invoker = new Invoker();

invoker.addCommand(new ConcreteCommand());

invoker.excute();

}

}



Caution


특별한 주의사항은 없다.
반응형
반응형
When Using It

조건에 따른 상태 자체를 클래스로 표현하고 싶을때

Class Diagram



Sample Code

public interface State {

public void handle(Context context, boolean condition);

}


public class ConcreteState implements State {

@Override

public void handle(Context context, boolean condition) {

if (condition) {

System.out.println("ConcreteState Handled.");

} else {

context.setState(new ConcreteState2());

}

}

}


public class ConcreteState2 implements State {

@Override

public void handle(Context context, boolean condition) {

if (condition) {

System.out.println("ConcreteState2 Handled.");

} else {

context.setState(new ConcreteState());

}

}

}


public class Context {

private State state; 

public void request() {

state = new ConcreteState();

state.handle(this, false);

state.handle(this, true);

}


public void setState(State state) {

this.state = state;

}

}


Caution


특별한 주의사항은 없다.
반응형
반응형
When Using It

자신의 상태의 저장본을 만들기

Class Diagram


Sample Code

public class Memento {

private String state;


public String getState() {

return state;

}


public void setState(String state) {

this.state = state;

}

}


public class Organitor {

private String state;

public Memento createMemento() {

Memento memento = new Memento();

memento.setState(state);

return memento;

}

public void setMemento(Memento memento) {

this.state = memento.getState();

}

}


public class CareTaker {

private Organitor organitor = new Organitor();

public void execute() {

Memento memento = new Memento();

memento.setState("GOOD");

organitor.setMemento(memento);

memento.setState("BAD");

memento = organitor.createMemento();

System.out.println(memento.getState());

}

}



Caution

특별한 주의사항은 없다.
반응형
반응형
When Using It

자신의 상태에 변화가 일어났을 경우 Observer들에게 통보하기

Class Diagram


Sample Code



public interface Observer {

public void update(Subject subject);

}


public class ConcreteObserver implements Observer {

@Override

public void update(Subject subject) {

System.out.println(subject.getState());

}

}


public abstract class Subject {

private List<Observer> observers = new ArrayList<Observer>();

public void attach(Observer observer) {

observers.add(observer);

}

public void detach(Observer observer) {

observers.remove(observer);

}


public void notifies() {

for (Observer observer : observers) {

observer.update(this);

}

}

public abstract void execute();

public abstract String getState();

}



public class ConcreteSubject extends Subject {

private String state;


@Override

public void execute() {

state = "GOOD";

notifies();

}


@Override

public String getState() {

return state;

}

}


Caution


특별한 주의사항은 없다.
반응형
반응형

When Using It

다수의 객체에 통합적인 지시를 내리기 위한 패턴. 클래스의 기능들을 분할하여 세분화된 클래스로 내렸을때, 세분화된 클래스간의 통신이 필요할때 유용하다.

Class Diagram


Sample Code

public interface Mediator {

}


public class ConcreteMediator implements Mediator {

private Colleague colleague;

private Colleague colleague2;

public void initializeColleague() {

colleague = new Colleague();

colleague2 = new Colleague();

colleague.setMediator(this);

colleague2.setMediator(this);

}

public void colleagueExecute() {

colleague.execute();

}

public void colleague2Execute() {

colleague2.execute();

}

}


public class Colleague {

private Mediator mediator;


public void setMediator(Mediator mediator) {

this.mediator = mediator;

}

public void execute() {

}

}

Case Study

1. GWT나 SWT같은 화면을 개발할 경우 Layout 아래에 Grid, Tree, Tab과 같은 다수의 클래스들이 선언된다. 이럴경우 Layout에 그려진 Grid를 클릭했을때 Detail Form에 데이터가 표시되어야 한다라는 요구사항이 있다고 가정하자. 이럴 경우 Layout 자체를 Mediator로 Grid와 Detail Form을 Colleague로 묶어놓으면 Grid와 Detail Form간의 변화 상황을 Layout을 통해 통보할 수 있다.

Caution


특별한 주의사항은 없다.

반응형
반응형
When Using It

다수의 처리자들을 연결하고 싶을때

Class Diagram


Sample Code



public abstract class Handler {

private Handler nextHandler;

public abstract boolean handleRequest();

public final void setNext(Handler handler) {

this.nextHandler = handler;

}

public final void process() {

if (handleRequest() == false) {

if ( nextHandler != null) {

nextHandler.handleRequest();

}

}

}

}


public class ConcreteHandler extends Handler {

@Override

public boolean handleRequest() {

return false;

}

}


public class ConcreteHandler2 extends Handler {

@Override

public boolean handleRequest() {

return true;

}

}



public class Client {

public void process() {

Handler handler1 = new ConcreteHandler();

Handler handler2 = new ConcreteHandler2();

handler1.setNext(handler2);

handler1.process();

}

}


Caution


특별한 주의사항은 없다.
반응형
반응형
When Using It

특정한 데이터 구조 가진 오브젝트를 방문하면서 처리를 하고 싶을때

Class Diagram


Sample Code



public interface Element {

public void accept(Visitor visitor);

public void add(Element element);

public List<Element> getChildren();

}


public class ConcreteElement implements Element {

private List<Element> children = new ArrayList<Element>();

@Override

public void accept(Visitor visitor) {

visitor.visitConcreteElement(this);

}


@Override

public void add(Element element) {

children.add(element);

}


@Override

public List<Element> getChildren() {

return this.children;

}

}


public abstract class Visitor {

public abstract void visitConcreteElement(Element element);

}



public class ConcreteVisitor extends Visitor {

@Override

public void visitConcreteElement(Element element) {

List<Element> children = element.getChildren();

for (Element child : children ) {

System.out.println(child);

}

}

}


Caution


특별한 주의사항은 없다.
반응형
반응형
When Using It

알고리즘 구현 부분을 교체 하고 싶을때

Class Diagram 
 


Sample Code



public interface Strategy {

public void algorithmInterface();

}


public class ConcreteStrategy implements Strategy {

@Override

public void algorithmInterface() {

}

}


public class Context {

private Strategy strategy;

public Context(Strategy strategy) {

this.strategy = strategy;

}

public void contextInteface() {

strategy.algorithmInterface();

}

}


Caution


특별한 주의사항은 없다.
반응형
반응형
When Using It

하위클래스에 구현을 위임하고 싶을때

Class Diagram 
 


Sample Code



public abstract class AbstractClass {

public abstract void templateMethod1();

public abstract void templateMethod2();

public abstract void templateMethod3();

public void execute() {

templateMethod1();

templateMethod2();

templateMethod3();

}

}


public class ConcreteClass extends AbstractClass {

@Override

public void templateMethod1() {}


@Override

public void templateMethod2() {}


@Override

public void templateMethod3() {}

}


Caution


특별한 주의사항은 없다.
반응형

+ Recent posts