加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

这是java中Bridge模式的正确实现吗?

发布时间:2020-12-15 04:36:34 所属栏目:Java 来源:网络整理
导读:我正在努力提高我对设计模式的了解,而且我对Bridge模式有点困惑.下面你可以看到我的例子: public interface Animal { public abstract void eat(); public abstract void move();}public class Jaguar implements Animal{ @Override public void eat() { Sy
我正在努力提高我对设计模式的了解,而且我对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();
    }
}

我的问题:

>这是一个正确的桥模式吗?
>如果接口被替换,是否可以使用Bridge模式
抽象类(我在这个tutoarial中看到了这种方法
http://www.newthinktank.com/2012/10/bridge-design-pattern-tutorial/).
但根据这个
(https://dzone.com/articles/design-patterns-bridge)似乎是
在我的情况下动物不应该是一个抽象类..
>是否有必要使用方法someAnimalEats()和
Environment类中的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 ...

客户端可能会执行以下操作:

Logger logger = new ErrorLogger(new FileLogOutputter("errors.log"));

>我建议我在这个例子中使用的类/接口组合是相当典型的.您可以创建抽象和接口,但考虑到桥接点是引用实现,它使它更容易使它成为一个抽象类.>希望这个例子也能回答这个问题:你可以在抽象和实现中使用类似的方法,但肯定没有必要.该模式的一个有趣且有用的方面是,不同的独立特征(在此示例中,记录的内容及其记录方式)可以单独定义为抽象和实现的扩展.这允许您混合和匹配特征,而不会失去控制的类结构.这些特征(即正交性)的独立性通常要求两种结构中的方法完全不同.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读