我正在寻找我刚刚制作的设计模式的名称,以及它是否是一个好的。
所以基本上我是在寻找一种方法来在一个actor类的子类中保持一个主行为,将其划分为子行为,这些子行为会根据子类实现的子接口而有所不同。
这里有一个简化的例子,使我的观点更容易理解。。。
演员班:
public abstract class Actor implements FirstSubBehavior, SecondSubBehavior/*, MoreBehaviors...*/{
public final void mainBehavior(){
doFirstSubBehavior();
doSecondSubBehavior();
/* ... */
//doNthSubBehavior();
System.out.println();
}
}
firstsubbehavior接口:
public interface FirstSubBehavior{
public void doFirstSubBehavior();
public interface FirstWay extends FirstSubBehavior{
public default void doFirstSubBehavior(){
System.out.println("I'm doing the 1st sub-behavior using the 1st way.");
}
}
public interface SecondWay extends FirstSubBehavior{
public default void doFirstSubBehavior(){
System.out.println("I'm doing the 1st sub-behavior using the 2nd way.");
}
}
/* ... */
public interface NthWay extends FirstSubBehavior{
public default void doFirstSubBehavior(){
System.out.println("I'm doing the 1st sub-behavior using the Nth way.");
}
}
}
第二个子行为接口:
public interface SecondSubBehavior{
public void doSecondSubBehavior();
public interface FirstWay extends SecondSubBehavior{
public default void doSecondSubBehavior(){
System.out.println("I'm doing the 2nd sub-behavior using the 1st way.");
}
}
public interface SecondWay extends SecondSubBehavior{
public default void doSecondSubBehavior(){
System.out.println("I'm doing the 2nd sub-behavior using the 2nd way.");
}
}
/* ... */
public interface NthWay extends SecondSubBehavior{
public default void doSecondSubBehavior(){
System.out.println("I'm doing the 2nd sub-behavior using the Nth way.");
}
}
}
还有一个主要的类来测试这一切:
public class Main{
public static void main(String[] args){
class Actor1 extends Actor implements FirstSubBehavior.FirstWay, SecondSubBehavior.FirstWay {}
new Actor1().mainBehavior();
class Actor2 extends Actor implements FirstSubBehavior.FirstWay, SecondSubBehavior.NthWay {}
new Actor2().mainBehavior();
}
}
这将产生以下输出:
I'm doing the 1st sub-behavior using the 1st way.
I'm doing the 2nd sub-behavior using the 1st way.
I'm doing the 1st sub-behavior using the 1st way.
I'm doing the 2nd sub-behavior using the Nth way.
所以main很重要,在这里您可以看到我想要如何使用actor类:我想要对所有子类的主行为编写一次代码,但是能够根据它实现的默认子行为使其不同。
希望我说的很清楚,如果不清楚的话我可以重新表述。
1条答案
按热度按时间nwlqm0z11#
仔细阅读利斯科夫的替代品。所以你的模式破坏了你的行为。
出现的问题:
如果两个步骤之间的状态转换需要是原子的/事务的呢(全部或无)
如果在执行已获取资源的步骤时抛出runtimeexception怎么办?
如果下链的条件需要上链的更改怎么办?
这种链接模式已经存在,但作为有效的liskov替代品:
servlet有一个过滤器链,由接口明确限制。状态更改是可能的,如会话内存或请求 Package 。
验证程序只收集错误或快速失败,验证对象上没有状态更改(这是一个更一般的约定,因为没有什么可以阻止验证器示例也调用set方法,除非真的不可变被验证。)
通过命令进行状态转换。每个命令都绑定一个更改,可以执行、撤消或重新执行。命令序列形成一个链来更改一个或多个实体。命令本身是不可变的,顺序也不会改变。
策略是一种更好的模式,在一方有一个契约和多种实现。例如,xml读取器或编写器的构造依赖于产生通用接口的类路径。
我总是喜欢战略方法,但也像一个评论所建议的那样:为了一个特定的目的。您需要从各种资源中读取字符串行或一组专用记录:每个资源类型有一个策略。合同以界面形式表示,如:
这可以通过filelinereader、streamlinereader和/或userinputreader实现。然后将其链接为: