1

当我有疑问时,我正在阅读Head First Design Patterns这本书。

在第一章中,研究他们教授的策略模式以制作可互换的课程。根据下图:

策略模式

我的问题:如果我想制作一个具有可视化界面的桌面应用程序,并让某些用户比其他用户拥有更多的权限来管理 Ducks 及其行为,该怎么办?因此,他们可以例如FlyRocketPowered在运行时创建行为。我怎样才能做到这一点?

我的意思是,将这些行为表示为类对我来说看起来很奇怪,因为我看不到如何在用户级别使它们可编辑,每次需要创建/删除/更改a FlyBehavior、 aQuackBehavior或子类时,用户将Duck必须要求我通过创建/删除/更改类来修改源代码,但这不是我们想要的,我们需要一些更独立于开发人员的东西。

编辑

假设我想制作一个屏幕Add Fly Behavior(只是添加,不编辑,不删除),会有两个字段,第一个是,第二个是调用方法Behavior Name时要打印的内容。fly()

通过编辑源代码,我可以通过创建这样的类来做到这一点:

public class FlyRocketPowered implements FlyBehavior {
   public void fly() {
      System.out.println("I’m fl ying with a rocket!");
   }
}

我需要做什么才能在用户级别做到这一点?

4

2 回答 2

3

首先我想说我喜欢这本书。这是我最喜欢的编程书。

对于您的问题:我认为您有点误解了策略模式;)目标不是让您的用户在运行时创建新行为。但是通过这种模式,你可以给你的“管理员”一些面板来给任何 Duck 任何可用的行为。所以行为仍然在编译时生成。但是您可以在运行时交换行为

此外,就像一个有趣的事实:完全有可能让您的“管理员”在运行时创建新的行为。看看Java 编译器 api。但是,如果您考虑这样做,请记住安全漏洞有多大,以及最坏情况下的客户是多么愚蠢。

于 2013-10-07T18:22:26.320 回答
1

请注意,策略是也可以具有属性的类的实例。因此,您可以创建一个TextOutputFlyBehavior输出字符串的类,该字符串可以在运行时设置。然后,不同的鸭子类型可以接收相同 Strategy 类的不同实例,它们的行为相同但具有不同的数据。

public class TextOutputFlyBehavior implements FlyBehavior {

    private final String message;

    public TextOutputFlyBehavior(String message) {
        this.message = message;
    }

    public void fly() {
         System.out.println(message);
    }
}

[...]

// some hardcoded behaviors:
FlyBehavior propellerFlyBehavior = new TextOutputFlyBehavior("I am flying with a propeller!")
FlyBehavior rocketPoweredFlyBehavior = new TextOutputFlyBehavior("I am flying with a rocket!")

// a user-provided behavior:
BufferedReader userInput = new BufferedReader( new InputStreamReader(System.in) );
System.out.println("Enter text for your custom duck: ");
FlyBehavior customFlyBehavior = new TextOutputFlyBehavior( userInput.readLine() );

// creating the ducks using these behaviors
Duck propellerDuck = new Duck( propellerFlyBehavior );
Duck rocketDuck = new Duck( rocketPoweredFlyBehavior);
Duck customDuck = new Duck( customFlyBehavior);

// when behavior strategies are immutable like this one, they can be reused
Duck propellerDuck2 = new Duck( propellerFlyBehavior );
Duck propellerDuck3 = new Duck( propellerFlyBehavior );
于 2013-10-07T18:27:48.310 回答