Java设计模式泛型化之命令模式

简单理解就是:

司令->传令官->士兵

但是这里隐含了一些东西:

命令是怎样的?

它的基本结构是:

一个抽象的命令接口
一个抽象的命令执行者接口
一个统一调用类
几个具体的命令实现类
几个具体的命令执行者实现类
一个调用者

先看看代码:

抽象的命令执行者接口

public interface Executor {

    public void doSomething();
    
    public void doOtherthing();
}

具体的命令执行者实现类

public class ExecutorA implements Executor {

    @Override
    public void doSomething() {
        System.out.println("Executor A do something.");
    }

    @Override
    public void doOtherthing() {
        System.out.println("Executor A do otherthing.");
    }

}

public class ExecutorB implements Executor {

    @Override
    public void doSomething() {
        System.out.println("Executor B do something.");
    }

    @Override
    public void doOtherthing() {
        System.out.println("Executor B other thing.");
    }

}

抽象的命令接口

public abstract class Command {

    protected Executor executorA = new ExecutorA();
    
    protected Executor executorB = new ExecutorB();
    
    public abstract void execute();
}

具体的命令实现类

public class CommandA extends Command {

    @Override
    public void execute() {
        super.executorA.doSomething();
    }

}

public class CommandB extends Command {

    @Override
    public void execute() {
        super.executorB.doOtherthing();
    }

}

统一调用类

public class Invoker {

    private Command command;
    
    public void setCommand(Command command) {
        this.command = command;
    }
    
    public void doAction() {
        command.execute();
    }
}

调用者

public class CommandCaller {

    public static void main(String[] args) {
        Command ca = new CommandA();
        Invoker in = new Invoker();
        in.setCommand(ca);
        in.doAction();
    }
}

那么,如何泛型化呢?显然,Command是入口。泛型化代码如下:

抽象的命令接口

@SuppressWarnings("all")
public abstract class Command {

    protected T t;
    
    public Command(Class c) {
        try {
            t = (T) Class.forName(c.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public abstract void execute();
}

具体的命令接口实现类

public class CommandA extends Command {

    public CommandA(Class c) {
        super(c);
    }

    @Override
    public void execute() {
        super.t.doSomething();
    }

}

public class CommandB extends Command {

    public CommandB(Class c) {
        super(c);
    }

    @Override
    public void execute() {
        super.t.doOtherthing();
    }

}

统一调用类

public class Invoker> {

    private T t;
    
    public void setCommand(T t) {
        this.t = t;
    }
    
    public void doAction() {
        t.execute();
    }
}

调用者

public class CommandCaller {

    public static void main(String[] args) {
        Command ca = new CommandA(ExecutorA.class);
        Invoker> in = new Invoker>();
        in.setCommand(ca);
        in.doAction();
    }
}


你可能感兴趣的:(Java,设计,Java技术)