Студопедия — Знакомство с паттернами
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Знакомство с паттернами






 

Стоимость тура с проездом на АВТОБУСЕ

 

Рыбинск в 21:50 Иваново* в 21:50 Кострома* в 21:50 Тутаев в 22:30 Ярославль в 23:50 Семибратово в 00:20 Ростов в 00:45 Переславль в 02:00 Сергиев Посад в 03:15 дней/ ночей отдыха даты проживания в Вардане (считать ночами) взр. на ОСН. месте реб. от 4 до 12 лет (вкл.) на ОСН. месте взр. или реб. старше 13 лет на ДОП. месте реб. от 4 до 12 лет (вкл.) на ДОП. месте реб. 4 лет без места в номере 1-мест. разм.
04.06** - 17.06 места 10/9 06.06 - 15.06 11 800 11 300 10 700 10 600 5 000 17 100
13.06 - 27.06 места 11/10 15.06 - 25.06 12 300 11 800 11 000 10 900 5 000 18 000
23.06 - 06.07 места 10/9 25.06 - 04.07 13 100 12 600 11 600 11 500 5 000 19 600
02.07 - 15.07 места 10/9 04.07 - 13.07 14 700 14 200 12 800 12 600 5 000 22 700
11.07 - 24.07 места 10/9 13.07 - 22.07 15 200 14 700 13 300 13 100 5 500 23 200
20.07 - 02.08 места 10/9 22.07 - 31.07 15 400 14 900 13 500 13 400 5 500 23 500
29.07 - 11.08 места 10/9 31.07 - 09.08 16 600 16 100 14 400 14 200 5 500 25 800
07.08 - 20.08 места 10/9 09.08 - 18.08 17 100 16 600 14 900 14 700 6 000 26 300
16.08 - 29.08 места 10/9 18.08 - 27.08 17 100 16 600 14 900 14 700 6 000 26 300
25.08 - 07.09 места 10/9 27.08 - 05.09 14 200 13 700 12 500 12 400 5 000 21 600
03.09 - 15.09 места 9/8 05.09 - 13.09 12 200 11 700 11 000 10 900 5 000 17 600
11.09 - 23.09 места 9/8 13.09 - 21.09 12 100 11 600 10 900 10 800 5 000 17 400
19.09 – 01.10** места 9/8 21.09-29.09 11 500 11 000 10 300 10 200 4 500 16 700

 

* - трансфер для туристов из Костромы до Ярославля и обратно – за доп. плату 1100 р. /чел.

- трансфер для туристов из Иваново до Ярославля и обратно – за доп. плату 1500 р./чел.

- трансфер для туристов из Данилова до Ярославля и обратно - за доп. плату 1100 р./чел.

- трансфер для туристов из Вологды до Ярославля и обратно - за доп. плату 2000 р./чел.

- трансфер для туристов из Углича до Ярославля и обратно – за доп. плату 1500 р./чел.

**- возможна замена проезда на автобусе в одну сторону на проезд поездом.

Стоимость тура с проездом на ПОЕЗДЕ

из Ярославля если поезд №282Я, то в 17:49, приезд в ЛОО в 08:12 даты проживания в Вардане из Лоо поездом №282С в 18:44, приезд в 09:56 взр. на ОСН. месте реб. от 10 до 12 лет (вкл.) на ОСН. месте реб. от 5 до 9 лет (вкл.) на ОСН. месте реб. до 4 лет (вкл.) на ОСН. месте (б/м в поезде) взр. или реб. старше 13 лет на ДОП. месте реб.от 10 до 12 лет (вкл.) на ДОП. месте реб. от 5 до 9 лет (вкл.) на ДОП. месте реб. до 4 лет (вкл.) на ДОП. месте (б/м в поезде) 1-мест. разм.  
04.06 - 17.06 06.06 -15.06,10/9 15 400 14 900 11 100 6 300 14 300 14 200 10 400 5 600 20 700
13.06 - 27.06 15.06 - 25.06,11/10 15 900 15 400 11 600 6 800 14 600 14 500 10 700 5 900 21 600
23.06 - 06.07 25.06 - 04.07,10/9 16 700 16 200 12 400 7 600 15 200 15 100 11 300 6 500 23 200
02.07 - 15.07 04.07 - 13.07,10/9 18 300 17 800 14 000 9 200 16 400 16 200 12 400 7 600 26 300
11.07 - 24.07 13.07 - 22.07,10/9 18 300 17 800 14 000 9 200 16 400 16 200 12 400 7 600 26 300
20.07 - 02.08 22.07 - 31.07,10/9 18 500 18 000 14 200 9 400 16 600 16 500 12 700 7 900 26 600
29.07 - 11.08 31.07 - 09.08,10/9 19 700 19 200 15 400 10 600 17 500 17 300 13 500 8 700 28 900
07.08 - 20.08 09.08 - 18.08,10/9 19 700 19 200 15 400 10 600 17 500 17 300 13 500 8 700 28 900
16.08 - 29.08 18.08 - 27.08,10/9 19 700 19 200 15 400 10 600 17 500 17 300 13 500 8 700 28 900
25.08 - 07.09 27.08 - 05.09,10/9 17 800 17 300 13 500 8 700 16 100 16 000 12 200 7 400 25 200
03.09 - 15.09 05.09 - 13.09,9/8 15 700 15 200 11 400 6 700 14 500 14 400 10 600 5 900 21 100
11.09 - 23.09 13.09 - 21.09,9/8 15 400 14 900 11 200 6 600 14 200 14 100 10 400 5 800 20 700
19.09 - 01.10 21.09 - 29.09,9/8 15 300 14 800 11 100 6 500 14 100 14 000 10 300 5 700 20 500

 

Стоимость тура БЕЗ ПРОЕЗДА

 

даты проживания в Вардане (считать ночами) дней/ ночей отдыха взр. на ОСН. месте реб. до 12 лет (вкл.) на ОСН. месте взр. или реб. старше 13 лет на ДОП. месте реб. до 12 лет (вкл.) на ДОП. месте 1-мест. разм.
06.06 - 15.06 10/9 6 800 6 300 5 700 5 600 12 100
15.06 - 25.06 11/10 7 300 6 800 6 000 5 900 13 000
25.06 - 04.07 10/9 8 100 7 600 6 600 6 500 14 600
04.07 - 13.07 10/9 9 700 9 200 7 800 7 600 17 700
13.07 - 22.07 10/9 9 700 9 200 7 800 7 600 17 700
22.07 - 31.07 10/9 9 900 9 400 8 000 7 900 18 000
31.07 - 09.08 10/9 11 100 10 600 8 900 8 700 20 300
09.08 - 18.08 10/9 11 100 10 600 8 900 8 700 20 300
18.08 - 27.08 10/9 11 100 10 600 8 900 8 700 20 300
27.08 - 05.09 10/9 9 200 8 700 7 500 7 400 16 600
05.09 - 13.09 9/8 7 200 6 700 6 000 5 900 12 600
13.09 - 21.09 9/8 7 100 6 600 5 900 5 800 12 400
21.09-29.09 9/8 7 000 6 500 5 800 5 700 12 200

 

Введение в паттерны проектирования Java

Введение

Данная работа не претендует на полное освещение паттернов проектирования в java.

Целью работы является демонстрация применения паттернов для тех, кто впервые столкнулся с проблемами объектно-ориентированного проектирования.

Паттерны - это архитектурная конструкция, помогающая описать и решить некую задачу проектирования.

Ко времени представления паттернов разработка программного обеспечения(ПО) стала индустриальной задачей. Многие программисты понимали, что не стоит изобретать велосипед при создании нового ПО. Использование паттернов часто помогает решить эту задачу и бывает полезным, как отдельному разработчику, так и целой команде.

Кэнт Бэк и Вард Каннингем представили первые шаблоны проектирования для языка Smalltalk в 1987 г.

Э. Гамма, Р. Хелм, Р. Джонсон и Дж. Влиссидес в 1995 г опубликовали книгу «Приемы объектно–ориентированного проектирования. Паттерны проектирования», в которой были представлены 23 шаблона, ставших сейчас основными. С этой книги началось признание паттернов в мире программирования. Издание «банды четырех» (так в шутку прозвали авторов книги) до сих пор остается одним из ИТ-бестселлеров.

«Банда четырех» разделила паттерны проектирования на три основные группы:

· порождающие — призванные создавать объекты;

· структурные — меняющие структуру взаимодействия между классами;

· поведенческие — отвечающие за поведение объектов.

 

Знакомство с паттернами

Для знакомства с паттернами, выберем для обсуждения какой-нибудь паттерн, например паттерн «стратегия». Это паттерн поведения объектов, инкапсулирующий отдельные алгоритмы.

Попробуем разобраться в старом вопросе - что лучше отношение «содержит» или отношение «является». Иными словами - что применять наследование и композицию. Разберемся в терминологии.

Если между объектами существует отношение «является», то каждый объект подкласса является объектом суперкласса. В языке java объектные переменные являются полиморфными, т.е. объект подкласса можно присвоить переменной суперкласса. Автоматический замещение(перегрузка) метода суперкласса методом подкласса во время выполнения программы называется динамическим связыванием (аналог – виртуальный метод с++).

Рассмотрим традиционный пример с использованием полиморфизма. Допустим, имеется абстрактный класс Animmal, содержащий абстрактный методы speak(), sleep() и eat(). Имеется также две конкретных реализации класса Animmal – Dog и Cat. Создадим домашний зоопарк, состоящий из собаки и кошки. Вследствие динамического связывания животные домашнего зоопарка разговаривают по-своему - собаки лают, а кошки мяукают.

package homeStrategy;

 

public class home {

public static void main(String [] agr){

animmal []homeZoo = new animmal[2];

homeZoo[0]=new Dog(2,"Fido");

homeZoo[1]= new Cat(5,"Tom");

for(animmal x:homeZoo)

x.speak();

}

}

abstract class animmal{

int age;

String name;

animmal(){}

animmal(int age, String name){

this.age=age;

this.name = name;

}

abstract void speak();

abstract void sleep();

abstract void eat();

}

class Dog extends animmal{

Dog(int age,String name){

super(age,name);

}

@Override

void speak() {

System.out.println("Woof");

}

 

@Override

void sleep() {

System.out.println("I can sleap");

}

 

@Override

void eat() {

System.out.println("I can eate sugar");

}

 

}

class Cat extends animmal{

Cat(int age,String name){

super(age,name);

}

@Override

void speak() {

System.out.println("Meow");

}

 

@Override

void sleep() {

System.out.println("I can sleap");

}

 

@Override

void eat() {

System.out.println("I cannot eat sugar");

}

 

}

Допустим ситуация в доме изменилась – появился ребенок, у которого появились игрушечные собаки – плюшевые(PlushDog), резиновые(RubberDog), деревянные(WoodenDog). В связи с таким разнообразием необходимо добавить в класс Dog методы – плавать(swim) и двигаться(move), а также изменить метод speak().

Для простоты примера не будем в дальнейшем рассматривать класс Cat, откажемся от класса Animmal, заменим его классом Dog и добавим классы PlushDog, RubberDog и WoodenDog.

package DogHome;

 

public class Dog {

int age;

String name;

Dog(){}

Dog(int age, String name){

this.age=age;

this.name = name;

}

void speak() {

System.out.println("Woof");

}

 

 

void sleep() {

System.out.println("I can sleap");

}

 

 

void eat() {

System.out.println("I can eat sugar");

}

 

}

class PlushDog extends Dog{

PlushDog(int age, String name){

super(age,name);

}

@Override

void eat() {

System.out.println("I cannot eat");

}

}

class RubberDog extends Dog{

RubberDog(int age, String name){

super(age,name);

}

@Override

void speak() {

System.out.println("Peep");

}

@Override

void sleep() {

System.out.println("I can sleap");

}

@Override

void eat() {

System.out.println("I cannot eat");

}

}

class WoodenDog extends Dog{

WoodenDog(int age, String name){

super(age,name);

}

@Override

void speak() {

System.out.println("I can't speak");

}

@Override

void sleep() {

System.out.println("I can't sleap");

}

@Override

void eat() {

System.out.println("I can't eat");

}

}

public class Home {

public static void main(String [] arg){

Dog []DogRoom = new Dog[4];

DogRoom[0] = new Dog(2,"Fido");

DogRoom[1] = new PlushDog(2,"Sharik");

DogRoom[2] = new RubberDog(2,"Bobik");

DogRoom[3] = new WoodenDog(2,"Dik");

for(Dog x:DogRoom){

x.speak();

}

 

}

}

При таком определении классов ничего не сказано о методах плавать и двигаться. Будем считать, что деревянная собака недвижима и не может плавать, резиновая и настоящая могут плавать, плюшевая не может плавать, но может двигаться. Возникает проблема с методами swim и move. Можно добавить эти методы в класс Dog и перегрузить их для каждой собаки. Реализовать метод плавать и двигаться должны не все субклассы класса Dog. Всегда можно реализовать в субклассе метод, который ничего не делает, например void swim(){}. Но, тогда при появлении нового вида собаки, нужно будет всегда перегружать метод swim(). Что мы и сделали с методами speak(), sleep() и eat() при определении игрушечных собак. При дальнейшем рассмотрении класса Dog откажемся от методов sleep() и eat(). И покажем как более простым способом заставить только некоторых собак плавать и двигаться.

Давайте поместим методы swim и move в интерфейсы Swimable и Moveable и соответствующие собаки будут наследовать эти интерфейсы. Например,

public interface MoveAble {

void move();

}

class PlushDog extends Dog implements MoveAble{

PlushDog(int age, String name){

super(age,name);

}

@Override

void eat() {

System.out.println("I cannot eat");

}

 

@Override

public void move() {

System.out.println("I can move");

}

}

Реализация такого интерфейса частично решает проблему, но исключает возможность повторного использования кода (интерфейс не имеет реализации).

Итак, наследование не подходит, использование интерфейсов тоже.

Можно для решения проблемы воспользоваться следующим правилом.

Переменные составляющие объекта необходимо выделить и инкапсулировать, так чтобы позднее их было можно изменять, не воздействуя на постоянные составляющие. Это правило общее для всех приемов проектирования. Все паттерны обеспечивают возможность изменения некоторой части системы, независимо от других частей.

Создадим новые классы для представления аспектов swim и move, так называемые классы поведения.

package DogHome;

public interface MoveBehavior {

public void move();

}

package DogHome;

public interface SwimBehavior{

public void swim();

}

 

Классы реализующие поведение (либо плавает, либо нет, либо двигается, либо нет).

package DogHome;

public class Swim implements SwimBehavior{

 

@Override

public void swim() {

System.out.println("I can swim");

}

 

package DogHome;

public class NoSwim implements SwimBehavior{

 

@Override

public void swim() {

System.out.println("I can’t swim");

}

 

}

 

package DogHome;

public class Move implements MoveBehavior{

 

@Override

public void move() {

System.out.println("I can move");

}

 

}

package DogHome;

public class NoMove implements MoveBehavior{

 

@Override

public void move() {

System.out.println("I can’t move");

}

 

}

 

Тогда в классе Dog можно создать два объекта, отвечающих за поведение swim и move

public class Dog {

int age;

String name;

MoveBehavior moveBehavior;

SwimBehavior swimBehavior;

Dog(){}

Dog(int age, String name){

this.age=age;

this.name = name;

moveBehavior = new Move();

swimBehavior = new Swim();

 

}

void speak() {

System.out.println("Woof");

}

 

//делегируем операции классам поведения

void swim(){

swimBehavior.swim();

}

void move(){

moveBehavior.move();

}

 

}

В конструкторах классов игрушечных собак, создадим экземпляры соответствующих классов поведения:

class PlushDog extends Dog {

PlushDog(int age, String name){

this.age=age;

this.name = name;

moveBehavior = new Move();

swimBehavior = new NoSwim();

}

 

}

 

class RubberDog extends Dog{

RubberDog(int age, String name){

this.age=age;

this.name = name;

moveBehavior = new NoMove();

swimBehavior = new Swim();

}

@Override

void speak() {

System.out.println("Peep");

}

}

 

class WoodenDog extends Dog{

WoodenDog(int age, String name){

this.age=age;

this.name = name;

moveBehavior = new NoMove();

swimBehavior = new NoSwim();

}

@Override

void speak() {

System.out.println("I can't speak");

}

}

После всего сделанного легко выяснить, что могут сделать собаки, находящиеся в комнате.

package DogHome;

 

public class Home {

public static void main(String [] arg){

Dog []DogRoom = new Dog[4];

DogRoom[0] = new Dog(2,"Fido");

DogRoom[1] = new PlushDog(2,"Sharik");

DogRoom[2] = new RubberDog(2,"Bobik");

DogRoom[3] = new WoodenDog(2,"Dik");

for(Dog x:DogRoom){

x.speak();

x.swim();

x.move();

}

 

}

}

Собаки последовательно демонстрируют свои способности.

Woof

I can swim

I can move

Woof

I can't swim

I can move

Peep

I can swim

I can't move

I can't speak

I can't swim

I can't move

 

Получилось, что класс Dog содержит экземпляры MoveBehavior и SwimBehavior, которым делегируется выполнение соответствующих действий. Это и есть механизм композиции. Системы, созданные на основе композиции, обладают большей гибкостью. Они позволяют изменять поведение объекта во время выполнения. Покажем, как это сделать.

Добавим к класс Dog методы

void setMoveBehavior(MoveBehavior move){

moveBehavior = move;

}

void setSwimBehavior(SwimBehavior swim){

swimBehavior = swim;

}

После этого можно изменить поведение резиновой собаки (RubberDog). Допустим, что эта собака может плавать только в ванне. Создадим класс

package DogHome;

public class SwimInBath implements SwimBehavior{

 

@Override

public void swim() {

System.out.println("I can swim in the bath");

}

 

}

и изменим поведение резиновой собаки, находящейся в комнате

DogRoom[2].setSwimBehavior(new SwimInBath());

Теперь наши комнатные собаки могут просто плавать, плавать в ванне или вообще не плавать.

Описанный выше прием проектирования, в котором поведение делегируется объекту внутри класса, называется паттерн «стратегия». Заметим различие между методами speak и swim. Способ плавания можно изменить в процессе выполнения программы, а способ разговора – нет. Для изменения способа разговора надо изменять метод speak в классах «игрушечная собака». Это происходит из-за того, что метод разговора не делегирован объекту внутри класса.







Дата добавления: 2015-09-15; просмотров: 333. Нарушение авторских прав; Мы поможем в написании вашей работы!



Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...

Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

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

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

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

Виды сухожильных швов После выделения культи сухожилия и эвакуации гематомы приступают к восстановлению целостности сухожилия...

КОНСТРУКЦИЯ КОЛЕСНОЙ ПАРЫ ВАГОНА Тип колёсной пары определяется типом оси и диаметром колес. Согласно ГОСТ 4835-2006* устанавливаются типы колесных пар для грузовых вагонов с осями РУ1Ш и РВ2Ш и колесами диаметром по кругу катания 957 мм. Номинальный диаметр колеса – 950 мм...

Классификация и основные элементы конструкций теплового оборудования Многообразие способов тепловой обработки продуктов предопределяет широкую номенклатуру тепловых аппаратов...

Именные части речи, их общие и отличительные признаки Именные части речи в русском языке — это имя существительное, имя прилагательное, имя числительное, местоимение...

Интуитивное мышление Мышление — это пси­хический процесс, обеспечивающий познание сущности предме­тов и явлений и самого субъекта...

Studopedia.info - Студопедия - 2014-2024 год . (0.013 сек.) русская версия | украинская версия