Есть ли шаблон проектирования для внедрения методов в класс? - PullRequest
3 голосов
/ 02 февраля 2011

У меня есть набор классов, которые работают вместе (я кодирую в javascript).

Существует один родительский класс и несколько дочерних классов, которые создаются родительским классом.У меня есть несколько клиентов этих классов, каждый из которых должен добавить один или несколько методов к родительским или дочерним классам.

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

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

Мои вопросы:

  1. Разумно ли это делать?
  2. Каким будет шаблон проектирования для того, что я делаю?

Ответы [ 4 ]

3 голосов
/ 02 февраля 2011

Шаблон стратегии предназначен для ситуаций, когда вы получаете свою «стратегию» во время выполнения. может быть применимо здесь. Стратегия в этом случае - это класс, который соответствует поведению, т. Е. Имеет метод вроде «execute» или любой другой.

Шаблон также может применяться. Это также шаблон времени выполнения, но он дополняет класс, который он украшает, на уровне метода.

Таким образом, шаблон Стратегия хорош, если вы выбираете класс динамически, а Декоратор хорош, если вы изменяете реализацию метода только во время выполнения.

(Я взял декораторскую часть этого ответа с разрешения ircmaxell)

2 голосов
/ 02 февраля 2011

Я должен признать, что шаблоны не моя «вещь» - но вы можете делать именно то, что вы хотите в JavaScript.Это то, как все фреймворки выполняют такие вещи, "расширяя" дочерние "классы" (в javascript нет классов).

Если вы находитесь в мире чистого javascript, вы хотите использовать:

foo.prototype.bar = function() {};

Таким образом, вы можете вызвать bar для любого foo, и bar существует в памяти только один раз - то есть одна и та же функция упоминается в памяти через каждый объект foo.Поэтому будьте осторожны с любыми переменными, на которые вы можете ссылаться за пределами этой области.

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

0 голосов
/ 02 февраля 2011

Как говорит hvgotcodes , вы описываете шаблон стратегии, то, как вы бы это делали для своего конкретного случая, это не использование прототипов (таким образом затрагивая все объекты вашего класса.)

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

, например

function MyClass() {
    this.myFunction = defaultFunction;

    this.defaultFunction = function() {
       // do something by default.
       alert("using default");
    }

    this.doFunction = function() {
       // something that calls myFunction.
       this.myFunction();
    }
}

---8< snip --------

// later on...

t = new MyClass();
t.doFunction(); // output 'using default'
t.myFunction = function(){ 
   // do something specific with this instance, when myFunction is called. 
   alert("customized for this instance.");
}
t.doFunction(); // output 'customized for this instance.'
0 голосов
/ 02 февраля 2011

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

Как и вы: я могу только догадываться, что вы не используете прототипы. Прототипы - это «правильный» шаблон проектирования для «объектно-ориентированного» JavaScript.

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

Расширение прототипов в JavaScript очень просто и никогда не должно становиться беспорядочным. Если это так, это, вероятно, означает, что вы слишком усложняете это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...