gpt4 book ai didi

java - 这是 Java 中桥接模式的正确实现吗?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:22:28 24 4
gpt4 key购买 nike

我正在努力提高我对设计模式的了解,但我对 Bridge 模式有点困惑。下面你可以看到我的例子:

public interface Animal {
public abstract void eat();
public abstract void move();
}


public class Jaguar implements Animal{

@Override
public void eat() {
System.out.println("The Jaguar eats meat");
}

@Override
public void move() {
System.out.println("The Jaguar runs");
}
}

public class Kangaroo implements Animal{

@Override
public void eat() {
System.out.println("THe Kangaroo eats grass and other vegetables");
}

@Override
public void move() {
System.out.println("The Kangaroo hops around :)");
}

}

public abstract class Environment {

private Animal animal;

public Environment(Animal animal){
this.animal = animal;
}

public void someAnimalEats(){
this.animal.eat();
}

public void someAnimalMoves(){
this.animal.move();
}

public abstract void environmentPolutionStatus();
}


public class Australia extends Environment{

public Australia(Animal animal) {
super(animal);
}

@Override
public void environmentPolutionStatus() {
System.out.println("Australia is in good shape as far as polution is concerned.");
}

}


public class Africa extends Environment{

public Africa(Animal animal) {
super(animal);
}

@Override
public void environmentPolutionStatus() {
System.out.println("Africa looks pretty good, however the hunting is kind of bad");

}

}

public class BridgePatternMain {
public static void main(String[] args){
Environment australiaKangaroo = new Australia(new Kangaroo());
Environment australiaJaguar = new Australia(new Jaguar());
Environment africaKangaroo = new Africa(new Kangaroo());
Environment africaJaguar = new Africa(new Jaguar());

australiaKangaroo.environmentPolutionStatus();
australiaKangaroo.someAnimalEats();
australiaKangaroo.someAnimalMoves();

australiaJaguar.environmentPolutionStatus();
australiaJaguar.someAnimalEats();
australiaJaguar.someAnimalMoves();

africaKangaroo.environmentPolutionStatus();
africaKangaroo.someAnimalEats();
africaKangaroo.someAnimalMoves();

africaJaguar.environmentPolutionStatus();
africaJaguar.someAnimalEats();
africaJaguar.someAnimalMoves();
}
}

我的问题:

  1. 这是正确的桥接模式吗?
  2. 如果接口(interface)被替换为桥接模式是否可能抽象类(我在这个教程中看到了这种方法 http://www.newthinktank.com/2012/10/bridge-design-pattern-tutorial/ ).但是根据这个( https://dzone.com/articles/design-patterns-bridge ) 看起来像在我的例子中,Animal 不应该是一个抽象类..
  3. 是否需要方法 someAnimalEats()someAnimalMoves() 在环境类中?更准确地说,是不是必须在此类中具有与每个对应的方法来自 Animal 接口(interface)的方法?

非常感谢!

最佳答案

  1. 您展示的领域(动物及其环境)并不是桥接模式的良好用例。它有一个非常具体的目的:将抽象(包括该抽象的扩展)与实现(同样可能包括扩展)分开。关键特征之一是抽象引用实现(名称中的“桥梁”)而不是扩展或实现抽象的实现。一般具体实现由客户端在运行时决定。

要为模拟真实世界对象(如动物和环境)的桥梁想出一个自然用例并不容易。更容易想到旨在执行某些功能的类。

// abstraction 
abstract class Logger {
protected final LogOutputter outputter;
public abstract void log(String message);
}

// abstraction extension
class ErrorLogger extends Logger {
public void log(String message) {
outputter.output("Error: " + message);
}
}

// implementation interface
interface LogOutputter {
void output(String message);
}

// implementation extensions
class FileLogOutputter implements LogOutputter ...
class ConsoleLogOutputter implements LogOutputter ...

客户端可能会做类似的事情:

Logger logger = new ErrorLogger(new FileLogOutputter("errors.log"));
  1. 我建议我在此示例中使用的类/接口(interface)组合非常典型。您可以创建抽象和接口(interface),但考虑到桥接点是引用实现,因此更容易使其成为抽象类。

  2. 希望这个例子也能回答这个问题:您可以在抽象和实现中使用类似的方法,但这当然不是必需的。该模式有趣且有用的方面之一是不同的独立特征(在本示例中,记录的内容和记录方式)可以单独定义为抽象和实现的扩展。这允许您混合和匹配特性,而不会出现失控的类结构。这些特征的独立性(即正交性)通常要求两种结构中的方法完全不同。

关于java - 这是 Java 中桥接模式的正确实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40376979/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com