|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- import java.util.ArrayList;
- import java.util.List;
-
- class PlayList {
-
- private static PlayList instance;
-
- private List<Song> list;
-
- private PlayList() {
- list = new ArrayList<Song>();
- }
-
- public static PlayList instance() {
- if(instance==null ) {
- instance = new PlayList();
- }
- return instance;
- }
-
- public void enqueue(Song song) {
- list.add(song);
- if(Player.instance().isIdle()) {
- new Thread() {
- public void run() {
- System.out.println("Playing playlist...");
- for (Song s : list) {
- Player.instance().play(s.getName());
- }
- }
- }.start();
- }
- }
-
- }
-
- class Song {
-
- private String name;
-
- public Song(String name) {
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
-
- }
-
- class Player {
-
- private static Player instance;
-
- private Player() {}
-
- public static Player instance() {
- if(instance==null ) {
- instance = new Player();
- }
- return instance;
- }
-
- public void play(String name) {
- System.out.println("Playing Song "+name+"...");
- }
-
- public boolean isIdle() {
- return true;
- }
- }
-
- class Jukebox {
-
- public void play(Song song) {
- Player.instance().play(song.getName());
- }
-
- }
-
- class Main {
-
- public static void main(String[] args) {
- Song song = new Song("Merry XMas");
- Jukebox jukebox = new Jukebox();
-
- jukebox.play(song);
- }
-
- }
-
- aspect PlaylistAspect {
-
- void around(Song song) :
- call(public void Jukebox.play(Song))
- && args(song) {
- PlayList.instance().enqueue(song);
- }
-
- }
-
- aspect CreditsAspect {
-
- void around() : call(public void Jukebox.play(Song)) {
- if(Credits.instance().enoughCredits()) {
- System.out.println("Withdrawing credit.");
- Credits.instance().withDraw();
- proceed();
- } else {
- throw new InsufficientCreditsException();
- }
- }
-
- }
-
- class Credits {
-
- private static final int INITIAL_CREDITS = 10;
-
- private static Credits instance;
-
- private int credits;
-
- private Credits() {
- credits = INITIAL_CREDITS;
- }
-
- public static Credits instance() {
- if(instance==null ) {
- instance = new Credits();
- }
- return instance;
- }
-
- public boolean enoughCredits() {
- return credits > 0;
- }
-
- public void withDraw() {
- credits--;
- }
- }
-
- @SuppressWarnings("serial")
- class InsufficientCreditsException extends RuntimeException {
-
- public InsufficientCreditsException() {
- super();
- }
-
- public InsufficientCreditsException(String message, Throwable cause) {
- super(message, cause);
- }
-
- public InsufficientCreditsException(String message) {
- super(message);
- }
-
- /**
- * @param cause
- */
- public InsufficientCreditsException(Throwable cause) {
- super(cause);
- }
-
- }
|