java设计模式,以保持行为的唯一性,但根据接口的不同而有所不同

rslzwgfq  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(256)

我正在寻找我刚刚制作的设计模式的名称,以及它是否是一个好的。
所以基本上我是在寻找一种方法来在一个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类:我想要对所有子类的主行为编写一次代码,但是能够根据它实现的默认子行为使其不同。
希望我说的很清楚,如果不清楚的话我可以重新表述。

nwlqm0z1

nwlqm0z11#

仔细阅读利斯科夫的替代品。所以你的模式破坏了你的行为。
出现的问题:
如果两个步骤之间的状态转换需要是原子的/事务的呢(全部或无)
如果在执行已获取资源的步骤时抛出runtimeexception怎么办?
如果下链的条件需要上链的更改怎么办?
这种链接模式已经存在,但作为有效的liskov替代品:
servlet有一个过滤器链,由接口明确限制。状态更改是可能的,如会话内存或请求 Package 。
验证程序只收集错误或快速失败,验证对象上没有状态更改(这是一个更一般的约定,因为没有什么可以阻止验证器示例也调用set方法,除非真的不可变被验证。)
通过命令进行状态转换。每个命令都绑定一个更改,可以执行、撤消或重新执行。命令序列形成一个链来更改一个或多个实体。命令本身是不可变的,顺序也不会改变。
策略是一种更好的模式,在一方有一个契约和多种实现。例如,xml读取器或编写器的构造依赖于产生通用接口的类路径。
我总是喜欢战略方法,但也像一个评论所建议的那样:为了一个特定的目的。您需要从各种资源中读取字符串行或一组专用记录:每个资源类型有一个策略。合同以界面形式表示,如:

public interface LineReader {
  List<String> readAll();
}

这可以通过filelinereader、streamlinereader和/或userinputreader实现。然后将其链接为:

// already unmodifiable, factory classes/ methods
final List<Command> commandChain=Commands.forUsecase(UseCase.READ_TRANSFORM_PERSIST);

final Processor p=new Processor();

// only proceeds upon valid records
p.setPrecondition(Validators.fixedLengthRecordStyle());
// set of commands doing something with the context and data
p.setCommandChain(commandChain);
// Where to take data from
p.setSource(new FileLineReader(new File("/tmp/input.csv", LineFilters.skipEmptyLinesAndComments())));

// now there's a result
final ProcessingResult pr = p.process();

if (!pr.isValid()) {
  // print validation errors and exit
}

if (!pr.isSuccessful()) {
  // print processing errors and exit
}

// print success and exit.
System.printf("Read %d records, stored %d records, %d were duplicates", 
  pr.getNumberOfRecords(), pr.getNumberOfSaved(), 
  pr.getNumberOfSkipped());

相关问题