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);
}