Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在运行时管理策略模式行为?_Java_Design Patterns - Fatal编程技术网

Java 如何在运行时管理策略模式行为?

Java 如何在运行时管理策略模式行为?,java,design-patterns,Java,Design Patterns,我在读这本书的时候,脑子里突然产生了一个疑问 在第一章中,研究了他们教授的策略模式,以制作可互换的课堂。如下图所示: 我的问题:如果我想制作一个具有可视界面的桌面应用程序,让一些用户比其他用户拥有更多的权限来管理鸭子及其行为,该怎么办?例如,他们可以在运行时创建FlyRocketPowered行为。我怎样才能做到这一点 我的意思是,在我看来,这些行为被表示为类是很奇怪的,因为我不知道如何在用户级别使它们可编辑,每次FlyBehavior,需要创建/删除/更改QuackBehavior或Duck

我在读这本书的时候,脑子里突然产生了一个疑问

在第一章中,研究了他们教授的策略模式,以制作可互换的课堂。如下图所示:

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

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

编辑

假设我想制作一个屏幕
Add Fly Behavior
(只需添加、不编辑、不删除),将有两个字段,第一个字段是
行为名称
,第二个字段是调用
Fly()
方法时要打印的内容

通过编辑源代码,我可以创建如下类:

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

我需要做些什么才能在用户层面上做到这一点?

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

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

此外,有趣的是:
完全可以让您的“管理员”在运行时创建新行为。请看下面的图片。但如果你想这么做,请记住安全漏洞有多大,以及最坏情况下的客户有多愚蠢

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

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

此外,有趣的是:
完全可以让您的“管理员”在运行时创建新行为。请看下面的图片。但如果你想这么做,请记住安全漏洞有多大,以及最坏情况下的客户有多愚蠢

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

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 );

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

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 );

我认为这个问题很难用这样一个抽象的例子来概括。首先,您应该考虑允许用户创建自定义duck行为的用户界面应该如何工作以及它提供了哪些选项,然后您可以考虑如何在源代码级别表示用户的设计决策。首先阐述问题,然后思考解决方案。@Philipp,我试图通过编辑我的问题来更好地解释它。我认为这是一个很难用这样一个抽象的例子概括的问题。首先,您应该考虑允许用户创建自定义duck行为的用户界面应该如何工作以及它提供了哪些选项,然后您可以考虑如何在源代码级别表示用户的设计决策。首先阐述问题,然后思考解决方案。@Philipp,我试图通过编辑我的问题来更好地解释它。嗯。。我开始认为我真的错过了模式的要点,但如果是这样,我错过了大多数模式的要点,因为
编程到一个接口,而不是一个应用程序
最终会达到无法在用户级别编辑
行为的情况。@这不是设计模式要解决的数学问题。它们是以一种可以理解的方式来构建您的程序,而不是实现个性化或直接满足某些要求的手段。嗯。。我开始认为我真的错过了模式的要点,但如果是这样,我错过了大多数模式的要点,因为
编程到一个接口,而不是一个应用程序
最终会达到无法在用户级别编辑
行为的情况。@这不是设计模式要解决的数学问题。它们是以一种可以理解的方式来构建您的程序,而不是实现个性化或直接满足某些要求的手段。因此,我可以不把
FlyWithWings
FlyNoWay
行为作为类,而只创建
TextOutputFlyBehavior
类,然后将这两个类先存储在数据库中,然后在运行时加载它们?@Math是的,你可以这样做。当您想要实现更多不同的策略类时,您可以实现一些具有相同类型数据但使用方式不同的类,如
MessageBoxFlyBehavior
TextToAudioFlyBehavior
。我可以创建一个
列表,而不是一个行为接口<