Design patterns 纠正对桥型的不理解
我是否正确理解桥梁模式: 之前:Design patterns 纠正对桥型的不理解,design-patterns,bridge,Design Patterns,Bridge,我是否正确理解桥梁模式: 之前: public class Main2 { @SuppressWarnings("unused") public static void main(String[] args) { Car car11 = new BadNativeCar(); Car car12 = new GoodNativeCar(); Car
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() {
}
}
________Car_________
/ \
NativeCar ForeignCar
/ \ / \
GoodNativeCar BadNativeCar GoodForeignCar BadForeignCar
CarAbstraction
|
CarAbstractionImpl-------------HAS-A-------> CarImplementor
/ \ / \
NativeCar ForeignCar GoodCar BadCar
之后(桥牌):
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() {
}
}
________Car_________
/ \
NativeCar ForeignCar
/ \ / \
GoodNativeCar BadNativeCar GoodForeignCar BadForeignCar
CarAbstraction
|
CarAbstractionImpl-------------HAS-A-------> CarImplementor
/ \ / \
NativeCar ForeignCar GoodCar BadCar
据我所知,你试图做如下事情:
When:
A
/ \
Aa Ab
/ \ / \
Aa1 Aa2 Ab1 Ab2
Refactor to:
A N
/ \ / \
Aa(N) Ab(N) 1 2
(从这里得到:)
我对桥接模式不是很熟悉,但它看起来不错。从你的问题中,我得到了以下类图: 之前:
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() {
}
}
________Car_________
/ \
NativeCar ForeignCar
/ \ / \
GoodNativeCar BadNativeCar GoodForeignCar BadForeignCar
CarAbstraction
|
CarAbstractionImpl-------------HAS-A-------> CarImplementor
/ \ / \
NativeCar ForeignCar GoodCar BadCar
之后:
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() {
}
}
________Car_________
/ \
NativeCar ForeignCar
/ \ / \
GoodNativeCar BadNativeCar GoodForeignCar BadForeignCar
CarAbstraction
|
CarAbstractionImpl-------------HAS-A-------> CarImplementor
/ \ / \
NativeCar ForeignCar GoodCar BadCar
如果我们看一下bridge模式的类图,它看起来像是bridge模式。但是,类层次结构CarAbstraction--CarAbstractionImpl可以被复制。意味着CarAbstraction拥有CarImplementor,而NativeCar&ForeignCar将由CarAbstraction继承
所以,从类图上看,它看起来像桥接模式
但是概念上的观点呢?NativeCar和ForeignCar是抽象的还是也可以用作实现?它们可以和好车和坏车交换吗?这一事实也需要考虑。如果NativeCar和ForeignCar是抽象的,它们将GoodCar和BadCar作为实现,那么这种桥接模式适用于这种情况。这个问题有什么问题吗?