拡張FizzBuzzも結局Fizzの出力を0回か1回かそれ以上かのバリエーションになっているため
ID:V26zP6ij氏のカウント数を返す抽象化は正しいよ

あとはカウント数を返す抽象メソッドを共通インターフェースとして定めて
各ルールがそのインターフェース実装すればオブジェクト指向になるね

共通インターフェースの例

trait FizzBuzzRule {
fn count(&self, target: usize, number: usize) -> usize;
fn divisible(&self, target: usize, number: usize) -> bool {
target % number == 0
}
fn contains(&self, target: usize, number: usize) -> bool {
target.to_string().contains(&number.to_string())
}
}

count()は各ルールが実装すべき抽象メソッド
残りは各ルールが共通に使える具象メソッド