桥接模式按类型不同实现
Bridge pattern different implementation by type
我搜索了桥接模式的例子,下面的例子很好地解释了设计模式,但我对此有一个疑问 example.What 例如,如果手动齿轮 handleGear 方法对于汽车和卡车或汽车齿轮不同,我应该怎么做汽车或卡车的 handleGear 实现不同?您能否提供这种情况的示例代码?
/* Implementor interface*/
interface Gear{
void handleGear();
}
/* Concrete Implementor - 1 */
class ManualGear implements Gear{
public void handleGear(){
System.out.println("Manual gear");
}
}
/* Concrete Implementor - 2 */
class AutoGear implements Gear{
public void handleGear(){
System.out.println("Auto gear");
}
}
/* Abstraction (abstract class) */
abstract class Vehicle {
Gear gear;
public Vehicle(Gear gear){
this.gear = gear;
}
abstract void addGear();
}
/* RefinedAbstraction - 1*/
class Car extends Vehicle{
public Car(Gear gear){
super(gear);
// initialize various other Car components to make the car
}
public void addGear(){
System.out.print("Car handles ");
gear.handleGear();
}
}
/* RefinedAbstraction - 2 */
class Truck extends Vehicle{
public Truck(Gear gear){
super(gear);
// initialize various other Truck components to make the car
}
public void addGear(){
System.out.print("Truck handles " );
gear.handleGear();
}
}
/* Client program */
public class BridgeDemo {
public static void main(String args[]){
Gear gear = new ManualGear();
Vehicle vehicle = new Car(gear);
vehicle.addGear();
gear = new AutoGear();
vehicle = new Car(gear);
vehicle.addGear();
gear = new ManualGear();
vehicle = new Truck(gear);
vehicle.addGear();
gear = new AutoGear();
vehicle = new Truck(gear);
vehicle.addGear();
}
}
在好的设计中,Gear
不应该关心外部环境。因此,无论它安装在哪个 Vehicle
上,它都应该起作用。
你可以这样写
class SportCar extens Car {
public SportCar (Gear gear){
if (gear instanceof SportCarGear) {
super(gear);
} else {
super(new SportCarGear());
// throwing an exception is even worse
}
}
但它完全错误并且违反了太多事情:
- 来自用户的期望:
Car bolid = new SportCar(new TruckGear());
不会按预期行事。可以说这违反了 Liskov 原则,但我不确定它是否适用
- 更高的耦合:现在
SportCar
'knows' 关于 Gear
的特定实现
- 如果您有
CarGear
、TruckGear
等,则您的设计与 Bridge 提供的不同
您使用 Bridge 使 Vehicle
和 Gear
的实现独立。在那种情况下,任何期望 Gear
应该对 Vehicle
的不同实现采取不同的行为是......非常奇怪。
我搜索了桥接模式的例子,下面的例子很好地解释了设计模式,但我对此有一个疑问 example.What 例如,如果手动齿轮 handleGear 方法对于汽车和卡车或汽车齿轮不同,我应该怎么做汽车或卡车的 handleGear 实现不同?您能否提供这种情况的示例代码?
/* Implementor interface*/
interface Gear{
void handleGear();
}
/* Concrete Implementor - 1 */
class ManualGear implements Gear{
public void handleGear(){
System.out.println("Manual gear");
}
}
/* Concrete Implementor - 2 */
class AutoGear implements Gear{
public void handleGear(){
System.out.println("Auto gear");
}
}
/* Abstraction (abstract class) */
abstract class Vehicle {
Gear gear;
public Vehicle(Gear gear){
this.gear = gear;
}
abstract void addGear();
}
/* RefinedAbstraction - 1*/
class Car extends Vehicle{
public Car(Gear gear){
super(gear);
// initialize various other Car components to make the car
}
public void addGear(){
System.out.print("Car handles ");
gear.handleGear();
}
}
/* RefinedAbstraction - 2 */
class Truck extends Vehicle{
public Truck(Gear gear){
super(gear);
// initialize various other Truck components to make the car
}
public void addGear(){
System.out.print("Truck handles " );
gear.handleGear();
}
}
/* Client program */
public class BridgeDemo {
public static void main(String args[]){
Gear gear = new ManualGear();
Vehicle vehicle = new Car(gear);
vehicle.addGear();
gear = new AutoGear();
vehicle = new Car(gear);
vehicle.addGear();
gear = new ManualGear();
vehicle = new Truck(gear);
vehicle.addGear();
gear = new AutoGear();
vehicle = new Truck(gear);
vehicle.addGear();
}
}
在好的设计中,Gear
不应该关心外部环境。因此,无论它安装在哪个 Vehicle
上,它都应该起作用。
你可以这样写
class SportCar extens Car {
public SportCar (Gear gear){
if (gear instanceof SportCarGear) {
super(gear);
} else {
super(new SportCarGear());
// throwing an exception is even worse
}
}
但它完全错误并且违反了太多事情:
- 来自用户的期望:
Car bolid = new SportCar(new TruckGear());
不会按预期行事。可以说这违反了 Liskov 原则,但我不确定它是否适用 - 更高的耦合:现在
SportCar
'knows' 关于Gear
的特定实现
- 如果您有
CarGear
、TruckGear
等,则您的设计与 Bridge 提供的不同
您使用 Bridge 使 Vehicle
和 Gear
的实现独立。在那种情况下,任何期望 Gear
应该对 Vehicle
的不同实现采取不同的行为是......非常奇怪。