Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Паттерны в Java и C# 
:(
    Опции темы
Domestic Cat
Дата 16.2.2005, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



 Interpreter

Интерпретатор есть интерпретатор. Нужен он если
1. Необходимо парсить алгебраические выражения (см Origin, Mathematica, Matcad и пр.).
2. Необходимо "понимать" команды пользователя или выполнять определенные сценарии. Пример - скрипты в играх.
3. Нужно менять вывод данных, например, парсить команду юзера и выдавать необходимые столбцы БД, отсортированные по к-л признаку.

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


--------------------

PM   Вверх
Domestic Cat
Дата 18.2.2005, 05:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



 Iterator
Позволяет скрыть внутреннюю структуру и бизнес логику коллекции данных, предоставляя стандартный интерфейс для клиента. Думаю, тут особо объяснять не нужно, так как итераторы являются неотъемлимой частью Java и C#.
В Java есть интерфейс Iterator с методами hasNext, next, remove; C# - IEnumerator (Move, Reset, Current). Кроме того, в шарпе есть также индексеры, идея которых та же.
 Пример
Java

Без комментариев, все очевидно.
Код
import java.util.*;

public class Test
{
 public static void main(String[] args)
 {
    Employees e = new Employees();
    Iterator i = e.iterator();
    while(i.hasNext())
    {
     System.out.println(i.next());
    }
 }
}

class Employees
{
private String[] data;
private EmployeeIterator iter;
Employees()
{
 data = new String[] {"John Smith", "Pablo Picasso", "Stephen Spielberg"};
}

public Iterator iterator()
{
                // lazy evaluation
 if (iter == null)
  iter = new EmployeeIterator();
 else
  iter.reset();
 return iter;
}

public class EmployeeIterator implements Iterator
{
 private int index;
 
 public boolean hasNext()
 {
  return index < data.length;
 }
 
 public Object next()
 {
  index++;
  return data[index - 1];
 }
 
 public void remove() throws UnsupportedOperationException
 {
                       // птичка Обломинго - нема у нас такого метода
  throw new UnsupportedOperationException();
 }
 
 public void reset()
 {
  index = 0;
 }  
}
}


&nbsp;Преимущества

Предоставляет стандартный интерфейс, чем и напоминает паттерн Bridge. Преимущества те же - реализация скрыта от клиента.


--------------------

PM   Вверх
Domestic Cat
Дата 2.3.2005, 06:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



&nbsp;State
Предположим, что нужно создать некий объект, который будет вести себя по-разному, в зависимости от его текущего состояния. Примером может служить объект типа логгер, который можно "переключать" между состоянием "писать в файл" и "выводить на консоль".
Нетрудно догадаться, что реализация такого объекта включала бы множество конструкций if-else, что-то вроде
Код

if (currentState.equals("toFile"))
     // writeToFile()
else
if (currentState.equals("toConsole"))
   // writeToConsole()
else
//.........

Чем больше возможный состояний, тем сложнее становится класс, тем труднее его менять и поддерживать.
Чтобы исправить ситуацию, используем State паттерн. Вот одна из возможных реализаций :
1. Пишем абстрактный класс State с нужными нам методами
2. Пишем конкретные сабклассы State с реализацией этих методов.
3. Пишем класс, содержащий указатель на текущий сабкласс State.

Для нашего случая (самого элементарного) логгера см. пример.

&nbsp;Пример
Java

Код
import java.util.*;
import java.io.*;

public class Test
{
   public static void main(String [] ar) throws Exception
   {
      LogManager lm = new LogManager();
      lm.setToFile();
      lm.log("Hello!");
      lm.setToConsole();
      lm.log("I'm a log manager");
      lm.dispose();
   }
}

class LogManager
{
private State currentState;
private ConsoleState cs = new ConsoleState();
private FileState st = new FileState();

public void setToConsole()
{
 currentState = cs;
}

public void setToFile()
{
 currentState = st;
}

public void log(String s)
{
 currentState.log(s);
}

public void dispose()
{
 st.dispose();
}
}

abstract class State
{
public abstract void log(String s);
public void dispose() {};
}

class ConsoleState extends State
{
public void log(String s)
{
 System.out.println(new Date().toString() + "   " + s);
}
}

class FileState extends State
{
private FileWriter filew;
public FileState()
{
 try
 {
  filew = new FileWriter("log.txt");
 }
 catch (IOException ioe)
 {
  ioe.printStackTrace();
 }
}

public void log(String s)
{
 try
 {
  filew.write(new Date().toString() + "   " + s);
  filew.flush();
 }
 catch (IOException ioe)
 {
  ioe.printStackTrace();
 }
}

public void dispose()
{
 try
 {
  filew.close();
 }
 catch (IOException e)
 {
  e.printStackTrace();
 }
}
}



--------------------

PM   Вверх
Domestic Cat
Дата 7.3.2005, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



&nbsp;Strategy
Strategy паттерн очень похож на State, но назначение у него иное. State паттерн означает что возможно переключение между состояниями, поэтому состояния сосуществуют. Strategy, как следует из названия, - это выбор стратегии поведения, алгоритма вычислений. Алгоритм выыбирается и используется чаще всего один раз, ингда даже не пользователем а автоматически.
Примером является сохранение текста в редакторе - его можно сохранить в разных форматах - то есть, нужно выбрать алгоритм записи текста на диск.

Различие между паттернами довольно тонкое - то, что в одной ситуации может выглядеть как "состояние", в другой окажется "стратегией". Все зависит от намерений программиста.

&nbsp;Пример
C#
Код

namespace ConsoleApplication1
{
class Class1
{
 [STAThread]
 static void Main(string[] args)
 {
  Console.WriteLine("Enter 1 or 2");
  Strategy strategy = new Strategy();
         string s = Console.ReadLine();
  if (s == "1")
   strategy.SetToSqr();
  else
   strategy.SetToSqrt();
  strategy.DoOutput();
 }
}

internal class Strategy
{
 private Output activeStrategy;
 
 public void SetToSqrt()
 {
  activeStrategy = new SqrtOutput();
 }

 public void SetToSqr()
 {
  activeStrategy = new SqrOutput();
 }

 public void DoOutput()
 {
  activeStrategy.DoOutput();
 }
}

internal abstract class Output
{
 internal abstract void DoOutput();
}

internal class SqrOutput : Output
{
 internal override void DoOutput()
 {
  for (int i = 0; i < 10; i++)
   Console.WriteLine(i + "*" + i + " = " + i*i);
 }
}
internal class SqrtOutput : Output
{
 internal override void DoOutput()
 {
  for (int i = 0; i < 10; i++)
   Console.WriteLine("sqrt(" + i + ") = " + Math.Sqrt(i));
 }
}
}




--------------------

PM   Вверх
Dimonius
Дата 17.10.2006, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 11.10.2006

Репутация: 1
Всего: 1



А почему некоторые сообщения скрыты?
Где можно про паттерны более подробно почитать? (желательно учебник)
PM MAIL   Вверх
powerOn
Дата 17.10.2006, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Цитата(Dimonius @  17.10.2006,  11:41 Найти цитируемый пост)
А почему некоторые сообщения скрыты?

Так надо.

Цитата(Dimonius @  17.10.2006,  11:41 Найти цитируемый пост)
Где можно про паттерны более подробно почитать? (желательно учебник)

Вот тут обсуждалось.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
0000
Дата 15.12.2006, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: нет
Всего: 5



про одиночку кто-то тут писал
Код

class Singleton
{
    private static Singleton instance;
    private Singleton() {}
    public static Singleton getInstance()
    {
        if (instance == null) 
               instance = new Singleton();
        else return null;
        return instance;
    }

    public static void dispose()
    {
        instance = null;
    }
}

код неверный...в этом случае GetInstance() в случае уже однажды созданного объекта Singleton instance вернет нулл...
тут надо убрать else..
а метод Dispose вообще следует применять очень аккуратно, ведь удалив одиночку его можно будет создать потом еще - создастся уже другой одиночка...но опять же он будет один в системе..
вот так правильно:
Код

class Singleton
{
    private static Singleton instance;
    private Singleton() {}
    public static Singleton getInstance()
    {
        if (instance == null) 
               instance = new Singleton();
        return instance;
    }
    public static void dispose()
    {
        instance = null;
    }
}

PM MAIL ICQ   Вверх
zaletskyy
Дата 18.4.2008, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 18.4.2008
Где: Ukraine, L'vi v

Репутация: нет
Всего: нет



Я пробывал в компиляторе запустить код для Factory, что ты приводил. И он особо не запускался. Вот код который я написал на основании твоего.

    
Код

public class Class1
    {
        abstract class Filter
        {
            protected ImageFilter imageFilter;
            public ImageFilter MyImageFilter
            {
                get
                {
                    return imageFilter;
                }
            }
        }

        class Filter1 : Filter
        {
            public Filter1()
            {
                imageFilter = new ImageFilter1();
            }
        }

        class Filter2 : Filter
        {
            public Filter2()
            {
                imageFilter = new ImageFilter2();
            }
        }
        
        
        

        public static void main()
        {
            Filter f = new Filter1();
            ImageFilter imf = f.MyImageFilter;
        }


Что я сделал не так?

Это сообщение отредактировал(а) zaletskyy - 18.4.2008, 11:59
PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
Samotnik
Дата 18.4.2008, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



zaletskyy, какое отношение  код  сишарпа  имеет к  Java ? 

PM MAIL   Вверх
EJack
Дата 18.4.2008, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 4.9.2007

Репутация: нет
Всего: нет



При реализации одиночки мне кажеться надо метод getInstance описывать как synchronized
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0883 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.