суббота, 14 февраля 2009 г.

Шаблон Expert

Я подробнее рассмотрю каждый шаблон. Начинаю с Expert, так как он первый по списку. Продолжу в прямой последовательности без прыжков через.
Общие замечания были "перечислены ранее":http://twowords.ru/development/15/osnovnye-shablony-proektirovaniya, сейчас же хочу проиллюстрировать диаграммой и кодом.

Главное положение, выдвигаемое шаблоном, говорит о том, что обязанность назначается тому классу, который имеет всё необходимое для её выполнения.

Я рассматриваю следующую ситуацию: есть кот, холодильник и сосиски в холодильнике. Кот открывает дверцу и оглядывается. Конечно, в реальности кот бы сам подсчитал количество сосисок, но в мире ПО этим непременно должен заняться сам холодильник. Почему? А всё потому, что он, как хранитель питательного мяса, _знает_ достаточно.

Ниже диаграмма.
!http://twowords.ru/images/3.gif!

На данный момент не располагаю инструментом для построения диаграмм последовательностей (ну нет их в Eclipse в стандартном плагине UML2). Посему пока диаграмма классов.

Код для каждого класса в отдельности.

public class Cat {
public void myau(){
System.out.print("myau!");
}
public void lookRound() {
Refrigerator.getInstance().Initialize();
Integer weight = Refrigerator.getInstance().getSausagesWeight();
System.out.println(weight.toString());
}
}


public class Refrigerator {
private List sausages;
static Refrigerator instance;
public void Initialize() {
sausages = new Vector();
sausages.add(new Sausage(50));
sausages.add(new Sausage(100));
}
private Refrigerator() { }
public static synchronized Refrigerator getInstance() {
if (instance == null) {
instance = new Refrigerator();
}
return instance;
}
public Integer getSausagesWeight() {
Integer weight = 0;
for (Sausage s : sausages) {
weight += s.getWeight();
}
return weight;
}
}


public class Sausage {
private Integer weight;
public Sausage(Integer w) {
weight = w;
}
public Integer getWeight() {
return weight;
}
}

Последовательность такая:
Cat c = new Cat();
c.myau();
c.lookRound();

Вывод:

bc. myau!150

Комментариев нет: