Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

MEMENTO. Адаптер (Adapter)




MEMENTO

The state of an object can be defined as the values of its properties or attributes

at any given point of time. The Memento pattern is useful for designing a

mechanism to capture and store the state of an object so that subsequently, when

needed, the object can be put back to this (previous) state. This is more like an

undo operation.

 

 

 

Решение сложных задач на C++

 


 

Адаптер (Adapter)

Проблема Необходимо обеспечить взаимодействие несовместимых интерфейсов или как создать единый устойчивый интерфейс для нескольких компонентов с разными интерфейсами.

Решение Конвертировать исходный интерфейс компонента к другому виду с помощью промежуточного объекта - адаптера, то есть, добавить специальный объект с общим интерфейсом в рамках данного приложения и перенаправить связи от внешних обьектов к этому объекту - адаптеру.

 

 

 

package app22. pkg2;   enum Status {Add, Del, Mod};   @FunctionalInterface public interface IFScan { void change(String name, Status st); //все интерфейсы принято делать void }
package app22. pkg2;   import java. io. IOException; import java. nio. file. *; import java. util. ArrayList;   public class FMonitor { String dir; ArrayList< IFScan> list;     public FMonitor(String dir) {    this. dir = dir;    list = new ArrayList(); } //методы подписки public void add(IFScan fs){ list. add(fs); } public void remove(IFScan fs){ list. remove(fs); } protected void fire(String name, Status st) {    for(IFScan fs: list)    {        fs. change(name, st);    } } // public void work() throws Exception{    WatchService watch = FileSystems. getDefault(). newWatchService();    Path path = Paths. get(dir);            path. register(watch, StandardWatchEventKinds. ENTRY_CREATE,                         StandardWatchEventKinds. ENTRY_DELETE,                         StandardWatchEventKinds. ENTRY_MODIFY);        //for(;; ){ //если хочу написать код, который мониторит события      WatchKey key = watch. take();      for(WatchEvent ev: key. pollEvents()){                        //System. out. println(ev. context());          String name = ev. context(). toString();                        if(ev. kind() == StandardWatchEventKinds. ENTRY_CREATE)//тип добавлен/удален //я работаю с событием которое добавлено          {              fire(name, Status. Add);          }          if(ev. kind() == StandardWatchEventKinds. ENTRY_DELETE)//тип добавлен/удален //я работаю с событием которое добавлено            {              fire(name, Status. Del);          }          if(ev. kind() == StandardWatchEventKinds. ENTRY_MODIFY)//тип добавлен/удален //я работаю с событием которое добавлено          {              fire(name, Status. Mod);          }                        //добавить в эту систему пару клиентов          //можно исп-ть лямбда выр          //   безымянный класс                   //  можно написать класс, реализовать интерфейс                          //   подпишите их на события и убедиться, что все работает                                                                                }      watch. close();   } //add //remove //notify //методы удаления подписчика }
    package app22. pkg2; class Client implements IFScan {     @Override public void change(String name, Status st) {    System. out. println(name+" status=" +st); }    } public class App222 { public static void main(String[] args) throws Exception {    // TODO code application logic here    FMonitor mon = new FMonitor(". " );          Client cl = new Client();            //подписка на события    mon. add(cl);            mon. work(); // должен вызываться последним }     }

 

 

МОЯ РЕАЛИЗАЦИЯ

package app22. pkg2;   enum Status {Add, Del, Mod};   @FunctionalInterface public interface IFScan { void change(String name, Status st); //все интерфейсы принято делать void }
package app22. pkg2;   import java. io. IOException; import java. nio. file. *; import java. util. ArrayList;   public class FMonitor { String dir; ArrayList< IFScan> list;     public FMonitor(String dir) {    this. dir = dir;    list = new ArrayList(); } //методы подписки public void add(IFScan fs){ list. add(fs); } public void remove(IFScan fs){ list. remove(fs); } protected void fire(String name, Status st) {    for(IFScan fs: list)    {        fs. change(name, st);    } } // public void work() throws Exception{    WatchService watch = FileSystems. getDefault(). newWatchService();    Path path = Paths. get(dir);            path. register(watch, StandardWatchEventKinds. ENTRY_CREATE,                         StandardWatchEventKinds. ENTRY_DELETE,                         StandardWatchEventKinds. ENTRY_MODIFY);        //for(;; ){ //если хочу написать код, который мониторит события      WatchKey key = watch. take();      for(WatchEvent ev: key. pollEvents()){                        //System. out. println(ev. context());          String name = ev. context(). toString();                        if(ev. kind() == StandardWatchEventKinds. ENTRY_CREATE)//тип добавлен/удален //я работаю с событием которое добавлено          {              fire(name, Status. Add);          }          if(ev. kind() == StandardWatchEventKinds. ENTRY_DELETE)//тип добавлен/удален //я работаю с событием которое добавлено          {              fire(name, Status. Del);          }          if(ev. kind() == StandardWatchEventKinds. ENTRY_MODIFY)//тип добавлен/удален //я работаю с событием которое добавлено          {              fire(name, Status. Mod);          }                   //добавить в эту систему пару клиентов          //можно исп-ть лямбда выр          //   безымянный класс                   //  можно написать класс, реализовать интерфейс                          //    подпишите их на события и убедиться, что все работает                                                                  }      watch. close();   } //add //remove //notify //методы удаления подписчика }
    package app22. pkg2; class Client implements IFScan {     @Override public void change(String name, Status st) {    System. out. println(name+" status=" +st); }    } public class App222 { public static void main(String[] args) throws Exception {    // TODO code application logic here    FMonitor mon = new FMonitor(". " ); //1. реализация с помощью класса    //Client cl = new Client();            //подписка на события   // mon. add(cl); //реализация с помощью класса             //2. реализация с помощью анонимного класса    /*    mon. add(new IFScan() {          @Override        public void change(String name, Status st) {           System. out. println(" client2 " + st));        }    });    */    //3. реализация с помощью лямбда-выражений    mon. add((s, st)-> System. out. println(" client2 " + st));            mon. work(); // должен вызываться последним }     }

 

 

РЕАЛИЗАЦИЯ КОРАБЛИНА

package app22. pkg2;   enum Status {Add, Del, Mod}   @FunctionalInterface public interface IFScan { void change(String name, Status st); }
package app22. pkg2;   import java. io. IOException; import java. nio. file. *; import java. util. ArrayList;   public class FMonitor { String dir; ArrayList< IFScan> list;    public FMonitor(String dir) { this. dir=dir; list=new ArrayList(); } public void add(IFScan fs) { list. add(fs); } public void remove(IFScan fs) { list. remove(fs); } protected void fire(String name, Status st) {    for(IFScan fs: list)      fs. change(name, st); } public void work() throws Exception { WatchService watch=            FileSystems. getDefault(). newWatchService(); Path path=Paths. get(dir); path. register(watch, StandardWatchEventKinds. ENTRY_CREATE,                      StandardWatchEventKinds. ENTRY_DELETE,                      StandardWatchEventKinds. ENTRY_MODIFY);        //for(;; ){ WatchKey key = watch. take(); for(WatchEvent ev: key. pollEvents()) {      String name=ev. context(). toString();                if (ev. kind()==StandardWatchEventKinds. ENTRY_CREATE)          fire(name, Status. Add);      if (ev. kind()==StandardWatchEventKinds. ENTRY_DELETE)          fire(name, Status. Del);      if (ev. kind()==StandardWatchEventKinds. ENTRY_MODIFY)          fire(name, Status. Mod); } watch. close(); } }
package app22. pkg2;   class Client implements IFScan { public void change(String name, Status st) {    System. out. println(name+" status=" +st); } } public class App222 { public static void main(String[] args) throws Exception{    FMonitor mon=new FMonitor(". " );            Client cl=new Client();    mon. add(cl);    mon. add((s, st)-> System. out. println(" client2 " +st));    mon. add(new IFScan() {        public void change(String name, Status st) {            System. out. println(" client3 " +st);        }    });            mon. work(); }    }

 

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...