2015-08-14 2 views
1

У меня есть класс перечислениеКак использовать шаблон дизайна вместо коммутатора случае

public enum TaskName { 
    LOGIN,REGISTER,MESSAGE 
} 

Я использую это перечисление с выключателем случае

public class TaskController { 


    private UserDao userDaoJpaImpl; 
    private FriendDao friendDaoJpaImpl; 
    private GroupDao groupDaoJpaImpl; 
    private MessageDao messageDaoJpaImpl; 

    public TaskController() { 
     EntityManagerFactory emfactory = Persistence.createEntityManagerFactory("Eclipselink_JPA"); 
     userDaoJpaImpl = new UserDaoJpaImpl(emfactory); 
     friendDaoJpaImpl = new FriendDaoJpaImpl(emfactory); 
     groupDaoJpaImpl = new GroupDaoJpaImpl(emfactory); 
     messageDaoJpaImpl = new MessageDaoJpaImpl(emfactory); 
    } 

    public void doIt(String taskName) 
    { 
     switch (taskName) { 
     case LOGIN: 
      userDaoJpaImpl.create(/*Something*/); 
      //Implementation 
     break; 
     case REGISTER: 
      //Implementation 
     break; 
     case MESSAGE: 
      messageDaoJpaImpl.create(/*Something*/); 
      //Implementation 
     break; 
     } 
    } 
} 

Я создаю объект TaskController в статический контроллер TaskController = new TaskController()

так, чтобы объект был создан только один раз

Теперь я планирую использовать команду вместо выключателя случае

, но я застрял, как использовать мой UserDaoJpaImpl, FriendDaoJpaImpl, GroupDaoJpaImpl, MessageDaoJpaImpl внутри команды classess

Редактировать

Command Класс

public interface Command { 

    void setSession(Session session); //Session is websocket connection session not HttpSession 

    void setConnectedUser(Map<String, UserDTO> connectedUser); 

    void setData(String data);   


    JSONObject execute(); 

} 

Я хочу, чтобы переместить весь журнал ic из TaskController.doIt() в другой класс команд, который будет реализовывать командный интерфейс.

Я использую Websocket. Я не хочу использовать пружину для этой проблемы

Заранее спасибо

+0

Командный шаблон в порядке. Но теперь это больше похоже на то, что вам нужен шаблон фабрики для создания экземпляров. Что заставляет вас думать, что вам нужен командный шаблон? Это требование или вы нашли вызов в этом?Но все ваши классы Impl должны реализовать интерфейс и просто вызвать метод create, основанный на нем. –

+0

извините, что я вставил старый код. Я уже реализовал интерфейс. Это не требование, которое я предложил. – abhishek221192

+0

Возможно, ваш контроллер слишком много (по крайней мере, один метод). Забудьте шаблон команды или у вас возникнет другая проблема. – atamanroman

ответ

2

Вы ищете мое решение этой проблемы here.

По существу,

public enum TaskName { 
    LOGIN { 
     @Override 
     public void doIt(TaskController taskController) { 
       taskController.getUserDao().create(/*something*/); 
       //... 
     } 
    }, 
    REGISTER { 
     @Override 
     public void doIt(TaskController taskController) { 
       //Implementation 
     } 
    }, 
    MESSAGE { 
     @Override 
     public void doIt(TaskController taskController) { 
       taskController.getMessageDao().create(/*something*/); 
       //... 
     } 
    }; 

    private TaskName() { 
    } 

    public abstract void doIt(TaskController taskController); 

    public static TaskName getByTaskName(String taskName) { 
     for(TaskName taskEnum : TaskName.values()) { 
      if(taskEnum.name().equalsIgnoreCase(taskName)) { 
       return taskEnum; 
      } 
     } 
     throw new IllegalArgumentException("The Task Name [" + taskName + "] is not a valid task name!"); 
    } 
} 

public class TaskController { 


    private UserDao userDaoJpaImpl; 
    private FriendDao friendDaoJpaImpl; 
    private GroupDao groupDaoJpaImpl; 
    private MessageDao messageDaoJpaImpl; 

    public TaskController() { 
     EntityManagerFactory emfactory = Persistence.createEntityManagerFactory("Eclipselink_JPA"); 
     userDaoJpaImpl = new UserDaoJpaImpl(emfactory); 
     friendDaoJpaImpl = new FriendDaoJpaImpl(emfactory); 
     groupDaoJpaImpl = new GroupDaoJpaImpl(emfactory); 
     messageDaoJpaImpl = new MessageDaoJpaImpl(emfactory); 
    } 

    public void doIt(String taskName) { 
     TaskName.getByTaskName(taskName).doIt(this); 
    } 
} 

Если я совершенно не понял ваш вопрос, потому что вы никогда не показали ничего о ваших Command классов.

Вы также должны рассмотреть возможность использования рамки для этой конкретной проблемы, например, Spring Framework.

2

Сохранение непонятного и субъективного вопроса дает нам свободу вообразить :). Вот мой взгляд на структуру.

public interface Command { 
    public void doIt(EntityManagerFactory emFactory); 
} 

class LoginCommand implements Command { 
    @Override public void doIt(EntityManagerFactory emFactory) { 
     UserDaoJpaImpl userDaoJpaImpl = new UserDaoJpaImpl(emFactory); 
     // Do something 
    } 
} 

class RegisterCommand implements Command { 
    @Override public void doIt(EntityManagerFactory emFactory) { 
    } 
} 

class MessageCommand implements Command { 
    @Override public void doIt(EntityManagerFactory emFactory) { 
    } 
} 

enum TaskName { 
    LOGIN(new LoginCommand()), REGISTER(new RegisterCommand()), MESSAGE(new MessageCommand()); 

    private Command command; 

    TaskName(Command command) { 
     this.command = command; 
    } 

    public void doIt(EntityManagerFactory emFactory) { 
     command.doIt(emFactory); 
    } 
} 

public class TaskController { 
    private EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("Eclipselink_JPA"); 

    public void doIt(String taskName) { 
     TaskName task = TaskName.valueOf(taskName); 
     task.doIt(emFactory); 
    } 
} 

Все методы называются doIt и, конечно, они должны измениться.

0

Та же идея, что и @epicPandaForce, но в java 8 ее можно обрабатывать по-другому. Передача лямбды конструктору.

public enum TaskName { 
    LOGIN((taskController) -> { 
      taskController.getUserDao().create(/*something*/); 
      //... 
    }), 
    REGISTER((taskController) -> { 
      //Implementation 
    }), 
    MESSAGE((taskController) -> { 
      //... 
    }); 

    private final Consumer<TaskController> doIt; 

    private TaskName(Consumer<TaskController> doIt) { 
     this.doIt = doIt; 
    } 

    public final void service(...) { 
     doIt(...); 
    } 
1
public interface Command { 
public void Execute(); 
} 

public class Invoker { 
    private Map<TaskName,Command> commandMap = new EnumMap<TaskName,Command>(TaskName.class); 

    public void AddCommand(TaskName task,Command command){ 
     commandMap.put(task, command); 
    } 
    public void HandleCommand(TaskName task){ 
     Command command=commandMap.get(task); 
     command.Execute(); 
    } 
} 


public class ConcreteMessageCommand implements Command { 
    private MessageDao messageDaoJpaImpl; 
    public ConcreteMessageCommand(MessageDao md){ 
     messageDaoJpaImpl=md; 
    } 
    @Override 
    public void Execute() { 
     // TODO Auto-generated method stub 
     messageDaoJpaImpl.create(); 
    } 

} 



public class ConcreteUserCommand implements Command { 
    private UserDao userDaoJpaImpl; 

    public ConcreteUserCommand(UserDao ud){ 
     userDaoJpaImpl=ud; 
    } 

    @Override 
    public void Execute() { 
     userDaoJpaImpl.create(); 
    } 

} 



public class TaskController { 

    Invoker invoker; 
    public TaskController() { 
     EntityManagerFactory emfactory = Persistence.createEntityManagerFactory("Eclipselink_JPA"); 
     invoker=new Invoker(); 
     ConcreteUserCommand cuc=new ConcreteUserCommand(new UserDaoJpaImpl(emfactory)); 
     invoker.AddCommand(TaskName.LOGIN, cuc); 

     ConcreteMessageCommand cmc=new ConcreteMessageCommand(new MessageDaoJpaImpl(emfactory)); 
     invoker.AddCommand(TaskName.MESSAGE, cmc); 


    } 

    public void doIt(TaskName taskName) 
    { 
     invoker.HandleCommand(taskName); 
    } 
} 

public class Main { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     TaskController task=new TaskController(); 
     task.doIt(TaskName.LOGIN); 
    } 

} 

Вы можете использовать команду шаблон, чтобы исключить включение случае, как это, GroupDaoJpaImpl- MessageDaoJpaImpl можно рассматривать как приемник objects.You может изменить, когда объекты создаются для оптимизации кода.

Смежные вопросы