ПКРПСиБД LAB4 Бычков А.С. (Лабораторная работа 4)

2015-08-23СтудИзба

Описание файла

Файл "ПКРПСиБД LAB4 Бычков А.С." внутри архива находится в папке "Лабораторная работа 4". Документ из архива "Лабораторная работа 4", который расположен в категории "". Всё это находится в предмете "распределённые ис и базы данных" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "распределённые ис и базы данных" в общих файлах.

Онлайн просмотр документа "ПКРПСиБД LAB4 Бычков А.С."

Текст из документа "ПКРПСиБД LAB4 Бычков А.С."

Национальный исследовательский институт

Московский Энергетический Институт(Технический Университет)

Институт автоматики и вычислительной техники

Кафедра Прикладной математики





Лабораторная работа №4

по дисциплине:

Проектирование крупных распределенных программных систем и баз данных

тема: «Реализация поведенческого шаблона проектирования»











Выполнил:

Бычков А.С.







Москва

2012 г.



Шаблон “OBSERBER”

Категория

Поведенческий

Описание

Определяет зависимость типа “один ко многим” между объектами таким образом, что при изменении состояния одного объекта все зависящие от него оповещаются об этом и автоматически обновляются.

Уместность применения

1) Если при изменении одного объекта нужно также изменить зависимые объекты и их кол-во неизвестно.

2) Если объект должен оповещать других, но при этом ему неважно что это за объекты

Преимущества



1) Удобно оповещать и изменять другие зависимые объекты не зная ничего об их реализации

Недостатки



1) при большом кол-ве слушателей или трудоемкости изменений возможны большие затраты ресурсов при изменении Publisher

Реализация

public class ConsoleTipsWriter : ITipsObserver

{

public ConsoleTipsWriter(TipsPublisher aPublisher)

{

mPublisher = aPublisher;

}

public void onNewTip()

{

Console.WriteLine("NEW TIP IS " + mPublisher.getTipOfTheDay());

}

TipsPublisher mPublisher;

}

public interface ITipsObserver

{

void onNewTip();

}

public class TipsBeeper : ITipsObserver

{

public void onNewTip()

{

Console.Beep();

}

}

public class TipsPublisher

{

public TipsPublisher()

{

mTipOfTheDay = "DEFAULT TIP";

}

public void subscribe(ITipsObserver aObserver)

{

mObservers.Add(aObserver);

}

public void unsubscribe(ITipsObserver aObserver)

{

mObservers.Remove(aObserver);

}

public String getTipOfTheDay()

{

return mTipOfTheDay;

}

public void setTipOfTheDay(String aTipOfTheDay)

{

mTipOfTheDay = aTipOfTheDay;

notify();

}

public void notify()

{

foreach (ITipsObserver observer in mObservers)

{

observer.onNewTip();

}

}

String mTipOfTheDay;

List mObservers = new List();

}



ТЕСТИРОВАНИЕ



class Program

{

static void Main(string[] args)

{

testObserver();

Console.ReadLine();

}

static void testObserver()

{

Console.Out.WriteLine(">>>>TEST OBSERVER<<<<<");

TipsPublisher publisher = new TipsPublisher();

ConsoleTipsWriter writer = new ConsoleTipsWriter(publisher);

publisher.subscribe(writer);

publisher.setTipOfTheDay("DONT WORRY!");

System.Threading.Thread.Sleep(2000);

TipsBeeper beeper = new TipsBeeper();

publisher.subscribe(beeper);

publisher.setTipOfTheDay("BE HAPPY!");

System.Threading.Thread.Sleep(2000);

publisher.unsubscribe(writer);

publisher.setTipOfTheDay("BE HUGGIES!");

}

}

UML-диаграмма







Шаблон “EVENT_LISTENER”

Аналогичен шаблону Observer, но в метод notify() преобразуется в метод notify(Event aEvent), где Event – абстракция наступившего события.



Шаблон “STRATEGY”

Категория

Поведенческий

Описание

По типу клиента (или по типу обрабатываемых данных) выбирает подходящий алгоритм, который следует применить

Уместность применения

1) Программа должна обеспечивать различные варианты алгоритма или поведения

2) Нужно изменять поведение каждого экземпляра класса

3) Необходимо изменять поведение объектов на стадии выполнения



Преимущества



1) альтернатива порождению подклассов

2) избавление от условных операторов

3) выбор реализации клиентом

Недостатки



1) увеличение числа объектов в приложении

2)клиенты должны знать о возможных стратегиях

Реализация

public class ChaikeVoice : IBirdVoice

{

public void speak()

{

Console.Out.Write("YAYA");

}

}

public class DuckVoice : IBirdVoice

{

public void speak()

{

Console.Out.WriteLine("КРЯ КРЯ");

}

}

public interface IBirdVoice

{

void speak();

}

public class LakeBird

{

private Color clr;

private IBirdVoice voice;

public LakeBird(Color clr, IBirdVoice voice)

{

this.clr = clr;

this.voice = voice;

}

public void speak()

{

voice.speak();

}

}

static void Main(string[] args)

{

LakeBird duck = new LakeBird(Color.Aqua, new DuckVoice());

duck.speak();

LakeBird chaike = new LakeBird(Color.White, new ChaikeVoice());

chaike.speak();

Console.ReadLine();

}



Шаблон “NULL OBJECT”

Категория

Поведенческий

Описание

Предотвращает нулевые указатели, предоставляя объект «по умолчанию»

Уместность применения

1) Если необходимо запретить использовать null как объект по умолчанию

Преимущества



1) Не нужна проверка на null

2) Отказоустойчивость.

3) Строгая типизация.

Недостатки



1) неуверсальность

Реализация

static void Main(string[] args)

{

LakeBird bird = new LakeBird(Color.Beige, new DuckVoice());

bird.speak();

bird = new NullBird();

bird.speak();

}

public class NullBird : LakeBird

{

private class SilentVoice : IBirdVoice

{

public void speak()

{

}

}

public NullBird(): base(Color.Transparent, new SilentVoice())

{

}

}



Шаблон “ITERATOR”

Категория

Поведенческий

Описание

Предоставляет способ последовательного доступа ко всем элементам состав-

ного объекта, не раскрывая его внутреннего представления

Уместность применения

1 ) для доступа к содержимому агрегированных объектов без раскрытия их

внутреннего представления;

2) для поддержки нескольких активных обходов одного и того же агрегиро-

ванного объекта;

3) для предоставления единообразного интерфейса с целью обхода различных

агрегированных структур (то есть для поддержки полиморфной итерации).

Преимущества



1) поддерживает различные виды обхода агрегата

2) итераторы упрощают интерфейс класса Aggregate

Недостатки



1) не потокобезопасен.

Реализация

public interface IIterator

{

Object getFirst();

Object getNext();

Boolean isDone();

Object getCurrent();

}

public interface IList

{

void add(Object aObj);

void remove();

Object get(int i);

int getLength();

IIterator createIterator();

}

public class IteratorImpl : IIterator

{

IList mList;

int mCurIndex;

public IteratorImpl(IList aList)

{

mList = aList;

mCurIndex = 0;

}

public Object getFirst()

{

return mList.get(0);

}

public Object getNext()

{

mCurIndex++;

return mList.get(mCurIndex);

}

public Boolean isDone()

{

return mCurIndex >= mList.getLength()-1;

}

public Object getCurrent()

{

return mList.get(mCurIndex);

}

}

public class ListImpl : IList

{

private Object[] mObjects;

public ListImpl()

{

mObjects = new Object[0];

}

public IIterator createIterator()

{

return new IteratorImpl(this);

}

public void add(Object aObj)

{

Object[] newObjects = new Object[mObjects.Length + 1];

for (int i = 0; i < mObjects.Length; i++)

{

newObjects[i] = mObjects[i];

}

newObjects[newObjects.Length - 1] = aObj;

mObjects = newObjects;

}

public void remove()

{

Object[] newObjects = new Object[mObjects.Length - 1];

for (int i = 0; i < mObjects.Length - 1; i++)

{

newObjects[i] = mObjects[i];

}

mObjects = newObjects;

}

public int getLength()

{

return mObjects.Length;

}

public Object get(int i)

{

if (i >= getLength())

{

return null;

}

return mObjects[i];

}

}

static void Main(string[] args)

{

IList list = new ListImpl();

list.add(1);

list.add(2);

list.add(3);

list.add(4);

list.add(5);

IIterator iterator = list.createIterator();

Console.WriteLine("CUR ELEMENT IS "+iterator.getFirst());

while (!iterator.isDone())

{

Console.WriteLine("CUR ELEMENT IS " + iterator.getNext());

}

Console.ReadLine();

}

Шаблон “TEMPLATE METHOD”

Категория

Поведенческий

Описание

Шаблонный метод определяет основу алгоритма и позволяет подклассам пе-

реопределить некоторые шаги алгоритма, не изменяя его структуру в целом.

Уместность применения

1) чтобы однократно использовать инвариантные части алгоритма, оставляя

реализацию изменяющегося поведения на усмотрение подклассов

2) когда нужно вычленить и локализовать в одном классе поведение, общее

для всех подклассов, дабы избежать дублирования кода

3) для управления расширениями подклассов


Реализация

public abstract class AbstractAlgorithm

{

public abstract void abstractPart();

public void execute()

{

firstPart();

abstractPart();

lastPart();

}

private void firstPart()

{

Console.WriteLine("firstPart of algorithm");

}

private void lastPart()

{

Console.WriteLine("lastPart of algorithm");

}

}

public class AnotherConcreteAlgorithm : AbstractAlgorithm

{

public override void abstractPart()

{

Console.WriteLine("ANOTHER ABSTRACT PART IMPL");

}

}

public class ConcreteAlgorithm : AbstractAlgorithm

{

public override void abstractPart()

{

Console.WriteLine("ABSTRACT PART IMPL");

}

} static void Main(string[] args)

{

AbstractAlgorithm algo = new ConcreteAlgorithm();

algo.execute();

Console.WriteLine();

algo = new AnotherConcreteAlgorithm();

algo.execute();

Console.ReadLine();

}



Шаблон “COMMAND”

Категория

Поведенческий

Описание

Инкапсулирует запрос как объект, позволяя тем самым задавать параметры

клиентов для обработки соответствующих запросов, ставить запросы в очередь

или протоколировать их, а также поддерживать отмену операций.

Уместность применения

1) Если необходимо определять, ставить в очередь и выполнять запросы в разное время.

2) Необходима поддержка отмены операций и их протоколирование.

Реализация

public class AddCharCommand : ICommand

{

private StringContainer mCont;

private char mChar;

private bool mExecuted = false;

public AddCharCommand(StringContainer aCont, char aChar)

{

mCont = aCont;

mChar = aChar;

}

public void execute()

{

if (!mExecuted)

{

mCont.mString += mChar;

mExecuted = true;

}

}

public void unexecute()

{

if (mExecuted)

{

mCont.mString = mCont.mString.Substring(0, mCont.mString.Length - 1);

mExecuted = false;

}

}

}

public interface ICommand

{

void execute();

void unexecute();

}

public class RemoveCharCommand : ICommand

{

private StringContainer mCont;

private char mDeletedChar;

public RemoveCharCommand(StringContainer aCont)

{

mCont = aCont;

mDeletedChar = '\0';

}

public void execute()

{

if (mDeletedChar == '\0')

{

mDeletedChar = mCont.mString[mCont.mString.Length - 1];

mCont.mString = mCont.mString.Substring(0, mCont.mString.Length - 1);

}

}

public void unexecute()

{

if (mDeletedChar!='\0')

{

mCont.mString += mDeletedChar;

mDeletedChar = '\0';

}

}

}

public class StringContainer

{

public String mString;

public StringContainer(String aString)

{

mString = aString;

}

}

static void Main(string[] args)

{

StringContainer cont = new StringContainer("abcd");

ICommand addCommand = new AddCharCommand(cont, 'e');

Console.WriteLine("STRING IS: " + cont.mString);

addCommand.execute();

Console.WriteLine("STRING IS: " + cont.mString);

addCommand.unexecute();

Console.WriteLine("STRING IS: " + cont.mString);

ICommand delCommand = new RemoveCharCommand(cont);

Console.WriteLine("STRING IS: " + cont.mString);

delCommand.execute();

Console.WriteLine("STRING IS: " + cont.mString);

delCommand.unexecute();

Console.WriteLine("STRING IS: " + cont.mString);

Console.ReadLine();

}



Шаблон “MEMENTO”

Категория

Поведенческий

Описание

Не нарушая инкапсуляции, фиксирует и выносит за пределы объекта его внут-

реннее состояние так, чтобы позднее можно было восстановить в нем объект.

Уместность применения

1) необходимо сохранить мгновенный снимок состояния объекта (или его части),

чтобы впоследствии объект можно было восстановить в том же состоянии;

2)a прямое получение этого состояния раскрывает детали реализации и нару-

шает инкапсуляцию объекта.

Плюсы



1) Сохранение границ инкапсуляции.

2) Упрощение структуры хозяина.

Минусы

1) Значительные издержки при использовании паттерна.

2) В некоторых языках слож-

но гарантировать, что только хозяин имеет доступ к состоянию хранителя;



Реализация

public class Car : IOriginator

{

public int x;

public int y;

public void beep()

{

Console.WriteLine("BEEEP");

}

public void printCoords()

{

Console.WriteLine("X IS " + x + " Y IS " + y);

}

public Object getMemento()

{

return new Memento(x, y);

}

public void setMemento(Object memento)

{

if (memento is Memento)

{

x = ((Memento)memento).x;

y = ((Memento)memento).y;

}

}

}

public class Caretaker

{

private Object mMemento;

public void SaveState(IOriginator originator)

{

if (originator == null)

throw new ArgumentNullException("originator");

mMemento = originator.getMemento();

}

public void RestoreState(IOriginator originator)

{

if (originator == null)

throw new ArgumentNullException("originator");

if (mMemento == null)

throw new InvalidOperationException("mMemento == null");

originator.setMemento(mMemento);

}

}

public interface IOriginator

{

Object getMemento();

void setMemento(Object memento);

}

public class Memento

{

public int x;

public int y;

public Memento(int x, int y)

{

this.x = x;

this.y = y;

}

}

static void Main(string[] args)

{

Car car = new Car();

car.x = 10;

car.x = 10;

car.printCoords();

Console.WriteLine();

Caretaker ct1 = new Caretaker();

Caretaker ct2 = new Caretaker();

ct1.SaveState(car);

car.x = 100;

car.y = 50;

car.printCoords();

Console.WriteLine();

ct2.SaveState(car);

ct1.RestoreState(car);

car.printCoords();

Console.WriteLine();

ct2.RestoreState(car);

car.printCoords();

Console.WriteLine();

Console.ReadLine();

}





Шаблон “SPECIFICATION”

Категория

Поведенческий

Описание

Specification– поведенческий шаблон проектирования, в котором бизнес-правила соединены с помощью булевой логики.

Уместность применения

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

ПЛЮСЫ

1 ) делает код более читабельным;

2) облегчает внесение изменений;

3 ) уменьшает дублирование.



Реализация

public class AndSpecification : IBookSpecification

{

private IBookSpecification firstSpec;

private IBookSpecification secondSpec;

public AndSpecification(IBookSpecification firstSpec, IBookSpecification secondSpec)

{

this.firstSpec = firstSpec;

this.secondSpec = secondSpec;

}

public Boolean isSatisfiedBy(Book book)

{

return firstSpec.isSatisfiedBy(book) && secondSpec.isSatisfiedBy(book);

}

}

public class Book

{

public string Title { get; set; }

public decimal Price { get; set; }

public decimal ReleaseYear { get; set; }

public void printData()

{

Console.WriteLine("TITLE IS " + Title);

Console.WriteLine("PRICE IS " + Price);

Console.WriteLine("RELEASE_YEAR IS " + ReleaseYear);

}

}

public class BookNewReleaseSpecification : IBookSpecification

{

private readonly decimal _releaseYear;

public BookNewReleaseSpecification(decimal releaseYear)

{

_releaseYear = releaseYear;

}

public Boolean isSatisfiedBy(Book book)

{

return book.ReleaseYear >= _releaseYear;

}

}

public class BookPriceRangeSpecification : IBookSpecification

{

private readonly decimal? _priceHigh;

private readonly decimal? _priceLow;

public BookPriceRangeSpecification(decimal? priceHigh, decimal? priceLow)

{

_priceHigh = priceHigh;

_priceLow = priceLow;

}

public Boolean isSatisfiedBy(Book book)

{

return (book.Price = _priceLow);

}

}

public interface IBookSpecification

{

Boolean isSatisfiedBy(Book book);

}

static void Main(string[] args)

{

List books = new List();

Book book1 = new Book();

book1.Title = "Book A";

book1.Price = 100;

book1.ReleaseYear = 2012;

Book book2 = new Book();

book2.Title = "Book B";

book2.Price = 100;

book2.ReleaseYear = 1999;

Book book3 = new Book();

book3.Title = "Book C";

book3.Price = 500;

book3.ReleaseYear = 1999;

Book book4 = new Book();

book4.Title = "Book D";

book4.Price = 300;

book4.ReleaseYear = 2012;

books.Add(book1);

books.Add(book2);

books.Add(book3);

books.Add(book4);

IBookSpecification priceSpec = new BookPriceRangeSpecification(200, 0);

IBookSpecification releaseSpec = new BookNewReleaseSpecification(2012);

IBookSpecification andSpec = new AndSpecification(priceSpec, releaseSpec);

IEnumerable res = books.FindAll(andSpec.isSatisfiedBy);

foreach (Book b in res)

{

b.printData();

Console.WriteLine();

}

Console.ReadLine();

}

Шаблон “INTERPRETER”

Категория

Поведенческий

Описание

Решает часто встречающуюся, но подверженную изменениям, задачу. 

Уместность применения

1) Грамматика языка проста.

2) Эффективность не важна

Плюсы



1) Грамматику легко расширять и изменять.

Минусы



1 )Сопровождение грамматики с большим числом правил затруднительно.

Реализация

public class Context

{

public String message;

}

public class Expr : Expression

{

private char mChar;

private Boolean mBool;

public Expr(char aChar, Boolean aBool)

{

mChar = aChar;

mBool = aBool;

}

public override void interpret(Context aCont)

{

aCont.message += mChar + " * " + mBool.ToString();

}

}

public abstract class Expression

{

public abstract void interpret(Context aCont);

}

public class MainExpr : Expression

{

Expr e1;

Expr e2;

public MainExpr(Expr e1, Expr e2)

{

this.e1=e1;

this.e2=e2;

}

public override void interpret(Context aCont)

{

e1.interpret(aCont);

aCont.message += " | ";

e2.interpret(aCont);

}

}

public class RootExpr : Expression

{

MainExpr expr;

public RootExpr(MainExpr expr)

{

this.expr = expr;

}

public override void interpret(Context aCont)

{

expr.interpret(aCont);

Console.WriteLine(aCont.message);

}

}

static void Main(string[] args)

{

Expr expr1 = new Expr('a', true);

Expr expr2 = new Expr('b', false);

MainExpr mExpr = new MainExpr(expr1, expr2);

RootExpr rExpr = new RootExpr(mExpr);

rExpr.interpret(new Context());

Console.ReadLine();

}



Шаблон “MEDIATOR”

Категория

Поведенческий

Описание

Определяет объект инкапсулирующий способ взаимодействия нескольких объектов

Уместность применения

1) Если имеются объекты связи между которыми сложны и четко определены.

2) Нельзя повторно использовать объект т.к. он обменивается информацией с другими объектами

3) Поведение между объектами должно настраиваться без порождения множества подклассов

Преимущества



1) Снижает число порождаемых подклассов

2) Устранение связанности между объектами

3) Упрощение протокола взаимодействия

4) Централизация управления

5) Абстрагирование способа взаимодействия объектов

Реализация



public class CallCenter

{

public FireStation mStation;

public CallCenter(FireStation aStation)

{

mStation = aStation;

}

public void callFireman()

{

Console.WriteLine("CALL CENTER : HOUSE IS ON FIRE! GONNA CALL THE FIREMAN");

mStation.setAlarm();

}

public void reportBack()

{

Console.WriteLine("CALL CENTER : THE FIRE HAS BEEN LOCALIZED!");

}

}

public class Fireman

{

public FireStation mStation;

public Fireman(FireStation aStation)

{

mStation = aStation;

}

public void setAlarm()

{

Console.WriteLine("FIREMAN : HOUSE IS ON FIRE!!! GOING TO HELP");

System.Threading.Thread.Sleep(3000);

Console.WriteLine("FIREMAN : DONE WITH FIRE!!");

mStation.reportBack();

}

}

{

public abstract void reportBack();

public abstract void setAlarm();

}

public class FireStationImpl : FireStation

{

private CallCenter mCenter;

private Fireman mFireman;

public FireStationImpl()

{

}

public void setCallCenter(CallCenter aCenter)

{

mCenter = aCenter;

}

public void setFireman(Fireman aFireman)

{

mFireman = aFireman;

}

public override void reportBack()

{

mCenter.reportBack();

}

public override void setAlarm()

{

mFireman.setAlarm();

}

}

static void Main(string[] args)

{

FireStationImpl station = new FireStationImpl();

CallCenter center = new CallCenter(station);

Fireman fireman = new Fireman(station);

station.setCallCenter(center);

station.setFireman(fireman);

center.callFireman();

Console.ReadLine();

}

Шаблон “STATE”

Категория

Поведенческий

Описание

Позволяет объекту изменять свое поведение в зависимости от внутреннего состояния

Уместность применения

1) Когда поведение объекта зависит от состояния и может изменяться во время выполнения

2) Если в коде содержится много условных ветвей выбор которых зависит от состояния

Преимущества



1) Сокращение условных конструкций

2) Удобность переключения между состояниями

Недостатки

1) Сложность реализации при большом кол-ве состояний

Реализация

public class AnouncedState : IGameState

{

Game mGame;

public AnouncedState(Game aGame)

{

mGame = aGame;

}

public void printGameName()

{

Console.WriteLine("GAME NAME IS " + mGame.mName);

}

public void printReleaseDate()

{

Console.WriteLine("GAME IS NOT REALEASED YET");

}

public void setNextState()

{

mGame.mReleaseDate = DateTime.Now.ToShortDateString();

mGame.mCurState = mGame.mReleasedState;

}

}

class ClassifiedState : IGameState

{

Game mGame;

public ClassifiedState(Game aGame)

{

mGame = aGame;

}

public void printGameName()

{

Console.WriteLine("GAME NAME INFORMANTION IS CLASSIFIED");

}

public void printReleaseDate()

{

Console.WriteLine("GAME IS NOT REALEASED YET");

}

public void setNextState()

{

mGame.mCurState = mGame.mAnouncedState;

}

}

public class Game

{

public readonly String mName;

public String mReleaseDate;

public Game(String aName)

{

mName = aName;

mClassifiedState = new ClassifiedState(this);

mAnouncedState = new AnouncedState(this);

mReleasedState = new ReleasedState(this);

mCurState = mClassifiedState;

}

public IGameState mCurState;

public IGameState mClassifiedState;

public IGameState mAnouncedState;

public IGameState mReleasedState;

public void printGameName()

{

mCurState.printGameName();

}

public void nextStep()

{

mCurState.setNextState();

}

public void printReleaseDate()

{

mCurState.printReleaseDate();

}

}

public interface IGameState

{

void printGameName();

void printReleaseDate();

void setNextState();

}

public class ReleasedState : IGameState

{

Game mGame;

public ReleasedState(Game aGame)

{

mGame = aGame;

}

public void printGameName()

{

Console.WriteLine("GAME NAME IS " + mGame.mName);

}

public void printReleaseDate()

{

Console.WriteLine("GAME RELEASE DATE IS "+ mGame.mReleaseDate);

}

public void setNextState()

{

}

}

static void Main(string[] args)

{

Game game = new Game("STAR WARS");

game.printGameName();

game.printReleaseDate();

Console.WriteLine();

game.nextStep();

game.printGameName();

game.printReleaseDate();

Console.WriteLine();

game.nextStep();

game.printGameName();

game.printReleaseDate();

Console.ReadLine();

}

Шаблон “VISITOR”



Категория

Поведенческий

Описание

Определяет операцию выполняемую над всеми объектами из структуры. Позволяет определить новую операцию не изменяя классов объектов

Уместность применения

1) Когда в структуре присутствует множество объектов с различными интерфейсами и есть желание выполнять над ними операции в зависимости от классов

2) Классы в структуре изменяются редко а новые операции добавляются часто.

Преимущества



1) Упрощает добавление новых операций

2) Объединяет родс твенные операции и отсекает те которые не имеют к ним отношения

3) Посещение различных иерархий классов

Недостатки

1) Добавление новых классов объектов затруднено

2) Нарушение инкапсуляции

Реализация

public class BrokerVisitor : ICarVisitor

{

public void visitEngine(Engine engine)

{

engine.temperature = 150;

engine.isBroken = true;

}

public void visitWheels(Wheels wheels)

{

wheels.isBroken = true;

}

}

public class Car

{

public Engine engine;

public Wheels wheels;

public Car(Engine engine, Wheels wheels)

{

this.engine = engine;

this.wheels = wheels;

}

}

public class Engine : ICarElement

{

public int temperature = 20;

public Boolean isBroken = false;

public void accept(ICarVisitor visitor)

{

visitor.visitEngine(this);

}

}

public interface ICarElement

{

void accept(ICarVisitor visitor);

}

public interface ICarVisitor

{

void visitEngine(Engine engine);

void visitWheels(Wheels wheels);

}

public class RepairerVisitor : ICarVisitor

{

public void visitEngine(Engine engine)

{

engine.temperature = 20;

engine.isBroken = false;

}

public void visitWheels(Wheels wheels)

{

wheels.isBroken = false;

}

}

public class Wheels : ICarElement

{

public Boolean isBroken = false;

public void accept(ICarVisitor visitor)

{

visitor.visitWheels(this);

}

}

static void Main(string[] args)

{

Car car = new Car(new Engine(), new Wheels());

Console.WriteLine("ENGINE IS BROKEN: "+car.engine.isBroken);

Console.WriteLine("ENGINE TEMPERATURE IS: " + car.engine.temperature);

Console.WriteLine("WHEELS IS BROKEN: " + car.wheels.isBroken);

Console.WriteLine();

ICarVisitor broker = new BrokerVisitor();

ICarVisitor repairer = new RepairerVisitor();

car.engine.accept(broker);

Console.WriteLine("ENGINE IS BROKEN: " + car.engine.isBroken);

Console.WriteLine("ENGINE TEMPERATURE IS: " + car.engine.temperature);

Console.WriteLine("WHEELS IS BROKEN: " + car.wheels.isBroken);

Console.WriteLine();

car.wheels.accept(broker);

Console.WriteLine("ENGINE IS BROKEN: " + car.engine.isBroken);

Console.WriteLine("ENGINE TEMPERATURE IS: " + car.engine.temperature);

Console.WriteLine("WHEELS IS BROKEN: " + car.wheels.isBroken);

Console.WriteLine();

car.wheels.accept(repairer);

Console.WriteLine("ENGINE IS BROKEN: " + car.engine.isBroken);

Console.WriteLine("ENGINE TEMPERATURE IS: " + car.engine.temperature);

Console.WriteLine("WHEELS IS BROKEN: " + car.wheels.isBroken);

Console.WriteLine();

car.engine.accept(repairer);

Console.WriteLine("ENGINE IS BROKEN: " + car.engine.isBroken);

Console.WriteLine("ENGINE TEMPERATURE IS: " + car.engine.temperature);

Console.WriteLine("WHEELS IS BROKEN: " + car.wheels.isBroken);

Console.ReadLine();

}



Шаблон “CHAIN OF RESPONSIBILITY”



Категория

Поведенческий

Описание

Убирает привязку запроса к его получателю, давая возможность нескольким объектам выполнить запрос.

Уместность применения

1) Более одного объекта обрабатывающих запрос причем обработчики заранее неизвестны

2) Отправка запроса одному из нескольких объектов не указывая какому именно

2) Набор объектов обрабатывающих запрос должен создаваться динамически.

Преимущества



1) Уменьшение связности. Объект не знает кто обработает его запрос.

2) Гибкость в распределении обязанности между объектами

3) Получение не гарантированно

Недостатки

3) Получение не гарантированно

Реализация

public class Bank : ICreditHandler

{

ICreditHandler financialDept = new FinancialDepartment();

public Boolean giveCredit(Client client, int amount)

{

return financialDept.giveCredit(client, amount);

}

}

public class Client

{

public readonly String mName;

public readonly int mAge;

public readonly int mSalary;

public int mAccoutSum;

public Client(String aName, int aAge, int aSalary)

{

mName = aName;

mAge = aAge;

mSalary = aSalary;

mAccoutSum = 0;

}

}

public class FinancialDepartment : ICreditHandler

{

private SecurityDepartment sdpt;

public FinancialDepartment()

{

String[] bl = new String[1];

bl[0] = "B";

sdpt = new SecurityDepartment(bl);

}

public Boolean giveCredit(Client client, int amount)

{

if (client.mAge < 18)

{

Console.WriteLine("CREDIT REJECTED! AGE " + client.mAge + " IS TOO YOUNG");

return false;

}

if (client.mAge > 70)

{

Console.WriteLine("CREDIT REJECTED! AGE " + client.mAge + " IS TO OLD!");

return false;

}

if (client.mSalary * 12 < amount)

{

Console.WriteLine("CREDIT REJECTED! SALARY " + client.mSalary + " IS TO SMALL");

return false;

}

return sdpt.giveCredit(client, amount);

}

}

public interface ICreditHandler

{

Boolean giveCredit(Client client, int amount);

}

public class SecurityDepartment : ICreditHandler

{

String[] blacklist;

ValidatorDepartment vdpt;

public SecurityDepartment(String[] blackList)

{

this.blacklist = blackList;

vdpt = new ValidatorDepartment();

}

public Boolean giveCredit(Client client, int amount)

{

foreach (String blm in blacklist)

{

if (client.mName == blm)

{

Console.WriteLine("CREDIT REJECTED! USER "+blm+" IN BLACK LIST");

return false;

}

}

return vdpt.giveCredit(client, amount);

}

}

public class ValidatorDepartment : ICreditHandler

{

public Boolean giveCredit(Client client, int amount)

{

Console.WriteLine("CREDIT ACCEPTED");

client.mAccoutSum += amount;

return true;

}

}

static void Main(string[] args)

{

Client clientA = new Client("A", 17, 10000);

Client clientB = new Client("B", 30, 250000);

Client clientC = new Client("C", 45, 50000);

Bank bank = new Bank();

bank.giveCredit(clientA, 1000);

Console.WriteLine();

bank.giveCredit(clientB, 250000);

Console.WriteLine();

bank.giveCredit(clientC, 22000);

Console.WriteLine();

Console.ReadLine();

}



Шаблон “SIMPLE POLICY”

Аналогичен паттерну Strategy, но поведение хранится в специальном синглетоне, а не в объекте (Например ServicesHolder.getInstance().getPolicyByType(SomePolicy.TOKEN);

Плюсы

1) Удобен для использования в бизнес логике.



Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5280
Авторов
на СтудИзбе
419
Средний доход
с одного платного файла
Обучение Подробнее