Правильное понимание паттерна моста

Правильно ли я понял Узор Моста:

ДО:

  public class Main2 {
            @SuppressWarnings("unused")
            public static void main(String[] args) {
                Car car11 = new BadNativeCar();
                Car car12 = new GoodNativeCar();
                Car car21 = new BadForeignCar();
                Car car22 = new GoodForeignCar();
            }
        }

        interface Car{
            public void drive();
            public void stop();
        }

        class NativeCar implements Car{
            @Override
            public void drive() {
            }
            @Override
            public void stop() {
            }
        }

        class ForeignCar implements Car{
            @Override
            public void drive() {
            }
            @Override
            public void stop() {
            }
        }

        class GoodNativeCar extends NativeCar{
        }
        class BadNativeCar extends NativeCar{
        }
        class GoodForeignCar extends ForeignCar{
        }
        class BadForeignCar extends ForeignCar{
        }

ПОСЛЕ (МОСТ):

 public class Main2 {
        public static void main(String[] args) {
            BadCar badCar = new BadCar();
            GoodCar goodCar = new GoodCar();
            CarAbstraction car11 = new NativeCar(badCar);
            CarAbstraction car12 = new NativeCar(goodCar);
            CarAbstraction car21 = new ForeignCar(badCar);
            CarAbstraction car22 = new ForeignCar(goodCar);
        }
    }

    interface CarAbstraction{
        public void drive();
        public void stop();
    }

    //Abstraction
    abstract class CarAbstractionImpl implements CarAbstraction{
        private CarImplementor carImplementor;

        public CarAbstractionImpl(CarImplementor carImplementor) {
            this.carImplementor = carImplementor;
        }

        @Override
        public void drive() {
            carImplementor.drive();
        }
        @Override
        public void stop() {
            carImplementor.stop();
        }
    }

    //RefinedAbstraction1
    class NativeCar extends CarAbstractionImpl{
        public NativeCar(CarImplementor carImplementor) {
            super(carImplementor);
        }
    }
    //RefinedAbstraction2
    class ForeignCar extends CarAbstractionImpl{
        public ForeignCar(CarImplementor carImplementor) {
            super(carImplementor);
        }
    }



    //Implementor
    interface CarImplementor extends CarAbstraction{
    }

    //ConcreteImplementor1
    class GoodCar implements CarImplementor{
        @Override
        public void drive() {
        }
        @Override
        public void stop() {
        }
    }

    //ConcreteImplementor2
    class BadCar implements CarImplementor{
        @Override
        public void drive() {
        }
        @Override
        public void stop() {
        }
    }

person drifter    schedule 22.05.2012    source источник
comment
Что не так с этим вопросом?   -  person drifter    schedule 23.05.2012


Ответы (2)


Из вашего вопроса я получил следующую диаграмму классов:

ДО:

                    ________Car_________
                    /                    \
               NativeCar              ForeignCar
               /       \              /        \
   GoodNativeCar   BadNativeCar GoodForeignCar  BadForeignCar

ПОСЛЕ:

            CarAbstraction
                 |
         CarAbstractionImpl-------------HAS-A-------> CarImplementor
          /             \                              /          \
     NativeCar       ForeignCar                    GoodCar       BadCar

Если мы посмотрим на диаграмму классов шаблона моста на http://www.oodesign.com/bridge-pattern.html, похоже, шаблон моста. Однако иерархию классов CarAbstraction - CarAbstractionImpl можно опустить. Означает, что CarAbstraction ИМЕЕТ CarImplementor, а NativeCar и ForeignCar будут унаследованы CarAbstraction.

Итак, из диаграммы классов это похоже на образец моста.

Но как насчет концептуальных моментов? Являются ли NativeCar и ForeignCar абстракциями или их можно также использовать в качестве реализации? Могут ли они заменяться на GoodCar и BadCar? Этот факт также требует рассмотрения. Если NativeCar и ForeignCar являются абстракциями, а GoodCar и BadCar - реализацией, то этот шаблон моста для этой ситуации.

person doptimusprime    schedule 20.12.2012

Насколько я понимаю, вы пытаетесь сделать что-то вроде:

 When:

        A
     /     \
    Aa      Ab
   / \     /  \
 Aa1 Aa2  Ab1 Ab2

Refactor to:

     A         N
  /     \     / \
Aa(N) Ab(N)  1   2

(Получено отсюда: Когда вы используете шаблон моста? Чем он отличается от Шаблон адаптера?)

Я не очень хорошо знаком с паттерном «Мостик», но он кажется правильным.

person user1074896    schedule 23.05.2012