2016-11-13 4 views
0

У меня есть 3 проблемы, которые более или менее похожи.Возможность повторного использования и расширяемость в OOPL

  1. Учитывая целочисленный массив, я хочу, чтобы найти самый длинный непрерывный подмассив, так что подмассив в порядке возрастания номеров.

  2. Учитывая целочисленный массив, я хочу найти самый длинный непрерывный подмассив, такой, что подрамник имеет одинаковые числа.

  3. Учитывая массив символов, я хочу найти самый длинный непрерывный подмассив, такой, что подрамник имеет одинаковые символы.

Я хочу полностью использовать концепции повторного использования и расширяемости в oops. Я реализовал некоторый код с использованием шаблонов. Я попробовал и сделал шаблон класса для проблем 2 и 3, так как они оба можно просто сравнить значение ascii числа или символа. Но я не уверен, как интегрировать код для проблемы 1? Я просто хочу знать, как решать такие проблемы с точки зрения повторного использования и расширяемости с использованием наследования.

ответ

0

Strategy pattern на помощь: вы можете определить интерфейс, который инкапсулирует стратегию сопоставления, скажем SubarrayMatcher и создать две реализации, которые соответствуют «возрастающему порядку значений», а другой соответствует «одинаковым значениям». Затем ваш основной алгоритм может взять интерфейс в качестве параметра и обратиться к нему, чтобы выполнить сопоставление.

структура высокого уровня в псевдокоде:

Array<T> findLongestSubarray(Array<T> values, SubarrayMatcher<T> matcher); 

interface SubarrayMatcher<T> 
class IncreasingSubarrayMatcher<T> implements SubarrayMatcher<T> 
class ConstantSubarrayMatcher<T> implements SubarrayMatcher<T>