我正在努力提高我对设计模式的了解,而且我对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();
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题:
someAnimalEats()和
someAnimalMoves()环境中的类?更准确地说,是否必须在此类方法中使用与Animal接口中的每个方法相对应的方法?非常感谢!
想象一下模拟现实世界物体(如动物和环境)的桥梁的自然用例并不容易.更容易想到旨在执行某些功能的类.
// 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 ...
Run Code Online (Sandbox Code Playgroud)
客户端可能会执行以下操作:
Logger logger = new ErrorLogger(new FileLogOutputter("errors.log"));
Run Code Online (Sandbox Code Playgroud)
我建议我在这个例子中使用的类/接口组合是相当典型的.您可以创建抽象和接口,但考虑到桥接点是引用实现,它使它更容易使它成为一个抽象类.
希望这个例子也回答这个问题:你可以在抽象和实现中使用类似的方法,但这肯定没有必要.该模式的一个有趣且有用的方面是,不同的独立特征(在此示例中,记录的内容及其记录方式)可以单独定义为抽象和实现的扩展.这允许您混合和匹配特征,而不会失去控制的类结构.这些特征(即正交性)的独立性通常要求两种结构中的方法完全不同.
| 归档时间: |
|
| 查看次数: |
362 次 |
| 最近记录: |