这是java中Bridge模式的正确实现吗?
我正在努力提高我对设计模式的了解,而且我对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(); } } 我的问题: >这是一个正确的桥模式吗? 非常感谢! 解决方法
>您展示的领域(动物及其环境)对于桥梁模式来说并不是一个很好的用例.它有一个非常特定的目的:将抽象(包括该抽象的扩展)与实现(可能还包括扩展)分开.其中一个关键特性是抽象引用实现(名称中的“桥”),而不是扩展或实现抽象的实现.通常,具体实现由客户端在运行时决定.
想象一下模拟现实世界物体(如动物和环境)的桥梁的自然用例并不容易.更容易想到旨在执行某些功能的类. // 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")); >我建议我在这个例子中使用的类/接口组合是相当典型的.您可以创建抽象和接口,但考虑到桥接点是引用实现,它使它更容易使它成为一个抽象类.>希望这个例子也能回答这个问题:你可以在抽象和实现中使用类似的方法,但肯定没有必要.该模式的一个有趣且有用的方面是,不同的独立特征(在此示例中,记录的内容及其记录方式)可以单独定义为抽象和实现的扩展.这允许您混合和匹配特征,而不会失去控制的类结构.这些特征(即正交性)的独立性通常要求两种结构中的方法完全不同. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |