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

来源:互联网 发布:nba2konline奥登数据 编辑:程序博客网 时间:2024/05/17 21:41

简单理解就是:

司令->传令官->士兵

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

命令是怎样的?

它的基本结构是:

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

先看看代码:

抽象的命令执行者接口

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<T extends Executor> {    protected T t;        public Command(Class<? extends Executor> c) {        try {            t = (T) Class.forName(c.getName()).newInstance();        } catch (Exception e) {            e.printStackTrace();        }    }        public abstract void execute();}

具体的命令接口实现类

public class CommandA<T extends Executor> extends Command<T> {    public CommandA(Class<? extends Executor> c) {        super(c);    }    @Override    public void execute() {        super.t.doSomething();    }}

public class CommandB<T extends Executor> extends Command<T> {    public CommandB(Class<? extends Executor> c) {        super(c);    }    @Override    public void execute() {        super.t.doOtherthing();    }}

统一调用类

public class Invoker<T extends Command<? extends Executor>> {    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<ExecutorA> ca = new CommandA<ExecutorA>(ExecutorA.class);        Invoker<Command<ExecutorA>> in = new Invoker<Command<ExecutorA>>();        in.setCommand(ca);        in.doAction();    }}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 啤酒喝多了手抖怎么办 头撞了一下头疼怎么办 头撞了个包怎么办 狗狗尿血不吃药怎么办 手机点击全选文字消失了怎么办 dnf数据异常无故被制裁怎么办 手机wifj连不上去怎么办 手机wifi显示不可上网怎么办 慢性肾炎感冒了血尿了怎么办 连接不可用红叉怎么办 鼻咽癌放疗后失去味觉怎么办 感冒会引起肾疼怎么办 iga患者老被传染感冒怎么办 iga肾病感冒了要怎么办 感冒了腰特别疼怎么办 运动后头晕恶心想吐怎么办 3岁儿童自闭症无语言怎么办? 2岁智力发育迟缓怎么办 法国第一年语言没有通过怎么办 听力42天未通过怎么办 7岁儿童叛逆期怎么办 被忽视型幼儿该怎么办 言语发育障碍脑神经损伤怎么办 5岁幼儿胆子小怎么办 幼儿20天胆子小怎么办 两岁宝宝胆子小怎么办 两岁的宝宝胆子小怎么办 孕中期发烧38度怎么办 小班社会交往教案有垃圾怎么办 两个月婴幼儿哭闹入睡难怎么办 8岁儿童睡觉困难怎么办 做精细动作手抖怎么办 15个月宝宝缺锌怎么办 八个月宝宝有蛔虫怎么办 两个月婴儿缺锌怎么办 婴儿天热出汗多尿少怎么办 婴儿5个月不主动抓东西怎么办 打疫苗吃了辣怎么办 四个月宝宝枕秃怎么办 四个月的孩子缺钙怎么办 小孩张牙齿会发烧怎么办