Justin의 개발 로그

[AS-IS]

import java.util.ArrayList;
import java.util.List;

public class OriginalObserverPattern {
    interface Observer<T> {
        void notify(T message);
    }

    interface Subject<T> {
        void registerObserver(Observer<T> o);
        void notifyObservers(T message);
    }

    class WeatherFeed implements Subject<Integer> {
        private final List<Observer<Integer>> observers = new ArrayList<>();

        @Override
        public void registerObserver(Observer<Integer> o) {
            this.observers.add(o);
        }

        @Override
        public void notifyObservers(Integer degreesCelsius) {
            System.out.println("\n--새로운 온도 통지--");
            observers.forEach(o -> o.notify(degreesCelsius));
        }
    }

    //뉴스 채널
    class NewsChannel implements Observer<Integer> {

        @Override
        public void notify(Integer degree) {
            System.out.println("News : 기온이 " + degree + "도 입니다.");
        }
    }

    //Home Automation
    class HomeAutomation implements Observer<Integer> {
        final String name;
        final int onDegree4Airconditioner;
        final int offDegree4Airconditioner;
        boolean onAirconditioner = false;

        HomeAutomation(final String name, final int onDegree4Airconditioner, final int offDegree4Airconditioner) {
            this.name = name;
            this.onDegree4Airconditioner = onDegree4Airconditioner;
            this.offDegree4Airconditioner = offDegree4Airconditioner;
        }


        @Override
        public void notify(Integer degreesCelsius) {
            if(degreesCelsius >= onDegree4Airconditioner && onAirconditioner == false) {
                System.out.println(name + " : 에어컨 On");
                onAirconditioner = true;
            } else if(degreesCelsius <= offDegree4Airconditioner && onAirconditioner) {
                System.out.println(name + " : 에어컨 Off");
                onAirconditioner = false;
            }
        }
    }

    @Test
    void 날씨통보테스트() throws InterruptedException {
        WeatherFeed wf = new WeatherFeed();

        wf.registerObserver(new NewsChannel());
        wf.registerObserver(new HomeAutomation("영희네", 28, 27));
        wf.registerObserver(new HomeAutomation("철수네", 30, 28));


        wf.notifyObservers(28);
        Thread.sleep(2000);
        wf.notifyObservers(30);
        Thread.sleep(2000);
        wf.notifyObservers(29);
        Thread.sleep(2000);
        wf.notifyObservers(28);
        Thread.sleep(2000);
        wf.notifyObservers(27);

    }
}

 

[TO-BE]

public class LambdaObserver {
    @FunctionalInterface
    interface Observer<T> {
        void notify(T message);
    }

    interface Subject<T> {
        void registerObserver(Observer<T> o);
        void notifyObservers(T message);
    }

    class WeatherFeed implements Subject<Integer> {
        private final List<Observer<Integer>> observers = new ArrayList<>();

        @Override
        public void registerObserver(Observer<Integer> o) {
            observers.add(o);
        }

        @Override
        public void notifyObservers(Integer degreesCelsius) {
            System.out.println("\n--새로운 온도 통지--");
            observers.forEach(o -> o.notify(degreesCelsius));
        }
    }


    @Test
    void 날씨통보테스트() throws InterruptedException {
        WeatherFeed wf = new WeatherFeed();

        // 뉴스채널
        wf.registerObserver((Integer degree) -> {
            System.out.println("News : 기온이 " + degree + "도 입니다.");
        });

        // 아래 코드에는 오류가 있음
        wf.registerObserver(
                (Integer degree) -> {
                    final String name = "철수네";
                    final int onDegree4Airconditioner = 29;
                    final int offDegree4Airconditioner = 28;
                    boolean onAirconditioner = false;

                    if(degree >= onDegree4Airconditioner && onAirconditioner == false) {
                        System.out.println(name + " : 에어컨 On");
                        onAirconditioner = true;
                    } else if(degree <= offDegree4Airconditioner && onAirconditioner) {
                        System.out.println(name + " : 에어컨 Off");
                        onAirconditioner = false;
                    }
                }
        );


        wf.notifyObservers(28);
        Thread.sleep(2000);
        wf.notifyObservers(30);
        Thread.sleep(2000);
        wf.notifyObservers(29);
        Thread.sleep(2000);
        wf.notifyObservers(28);
        Thread.sleep(2000);
        wf.notifyObservers(27);
    }

}
profile

Justin의 개발 로그

@라이프노트

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!