Java设计模式学习笔记4

来源:互联网 发布:java list string 编辑:程序博客网 时间:2024/06/05 09:40

命令模式和模板方法模式

    • 命令模式和模板方法模式
      • 命令模式
      • 模板方法模式

命令模式

在日常开发中,我们可能会遇到这样的需求:开发一个集成控制电视,点灯等家电的多功能遥控器;亦或者是开发游戏中一个具有攻击,防御等功能的角色。这些需求的共同之处在于由一个对象发出几个毫无相关性的请求,接收请求者可以是多一个或者多个。此时就能体会到命令模式的妙处了,将请求封装成对象,以便使用不同的请求、日志、队列等来参数化其他对象。当然,命令模式也支持撤销操作。

这里就用开发游戏中的一个角色举例吧

Figure —角色类(接收请求的对象,具有攻击,防御等功能)

public class Figure {    String TAG = "Figure";    public void attack(){        Log.d(TAG, "excute: 拿起武器");    }    public void defend(){        Log.d(TAG, "excute: 拿起盾牌");    }    public void cancelAttack(){        Log.d(TAG, "excute: 收回武器");    }    public void canceldefend(){        Log.d(TAG, "excute: 收回盾牌");    }}

Commond —命令接口(把所有的请求封装成Commond对象)

public interface Commond {    void excute();    void cancel();}

Attack —攻击命令(持有接收该命令的对象)

public class Attack implements Commond {    private Figure figure;    public Acctack(Figure figure) {        this.figure = figure;    }    @Override    public void excute() {       figure.attack();    }    @Override    public void cancel() {        figure.cancelAttack();    }}

Defend—防御命令(参考Attack)

EmptyCommond —空命令()

public class EmptyCommond implements Commond {    public EmptyCommond() {    }    @Override    public void excute() {    }    @Override    public void cancel() {    }}

Invoker —命令发布者(相当于游戏手柄,有2个功能按键和一个撤销按键 )

public class Invoker {    private Commond[] commonds =new Commond[2];    private Commond cancelCommond =new EmptyCommond();    public Invoker() {    }    public void setCommond(int pos,Commond commond){        commonds[pos] =commond;    }    public void excuteCommond(int pos){        commonds[pos].excute();        cancelCommond =commonds[pos];    }    public void undoCommond(){        cancelCommond.cancel();    }}

客户端代码

//创建一个游戏角色Figure figure=new Figure();Commond attack=new Attack(figure);Commond defend=new Defend(figure);//给invoker对象设置按钮功能,第一个按钮功能为攻击,第二个为防御Invoker invoker =new Invoker();invoker.setCommond(0,attack);invoker.setCommond(1,defend);//执行攻击,测回,防御,撤回invoker.excuteCommond(0);invoker.undoCommond();invoker.excuteCommond(1);invoker.undoCommond();

模板方法模式

定义一个操作中的算法的骨架,将步骤延迟到子类中。模板方法使得子类能够不去改变一个算法的结构即可重定义算法的某些特定步骤。
模板方法模式也是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术。比如大家常用的java网络请求中HttpServlet的doGet(),doPost();Android View中的onLayout()方法等,都是基于模板方法模式的。

模板方法模式还是非常简单的。就拿最简单的测试而言吧,试卷大家都是一样的,不同的只有考生的答案。

TestPaper—试卷基类

public abstract class TestPaper {    public static final String TAG = "TestPaper";    public TestPaper() {        question1();        question2();        question3();    }    public void question1(){        Log.d(TAG, "question1");        answer1();    }    public void question2(){        Log.d(TAG, "question2");        answer2();    }    public void question3(){        Log.d(TAG, "question3");        answer3();    }    protected abstract void answer1();    protected abstract void answer2();    protected abstract void answer3();}

PaperA —试卷A(每张试卷除了答案,其他的都一样)

public class PaperA extends TestPaper {    @Override    protected void answer1() {        Log.d(TAG, "answer1: PaperA");    }    @Override    protected void answer2() {        Log.d(TAG, "answer2: PaperA");    }    @Override    protected void answer3() {        Log.d(TAG, "answer3: PaperA");    }}

PaperB—试卷B

public class PaperB extends TestPaper {    @Override    protected void answer1() {        Log.d(TAG, "answer1: PaperB");    }    @Override    protected void answer2() {        Log.d(TAG, "answer2: PaperB");    }    @Override    protected void answer3() {        Log.d(TAG, "answer3: PaperB");    }}

客户端

//直接通过new一个对象,两张试卷通过Log直接打印出来了TestPaper paperA = new PaperA();TestPaper paperB = new PaperB();

注:以上纯属个人观点,欢迎指正

原创粉丝点击