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();
注:以上纯属个人观点,欢迎指正
阅读全文
0 0
- Java设计模式学习笔记4
- Java设计模式 -- 学习笔记
- java 设计模式 学习笔记(4) 策略模式
- java设计模式学习笔记4 代理模式-动态代理
- 学习笔记——JAVA设计模式<4>原型模式
- java设计模式学习笔记-工厂模式
- java设计模式学习笔记-构建模式
- java设计模式学习笔记-原型模式
- java设计模式学习笔记-适配器模式
- java设计模式-工厂模式学习笔记
- java设计模式学习笔记--外观模式
- 学习笔记:Java设计模式-命令模式
- 学习笔记:java设计模式--命令模式
- java设计模式学习笔记--观察者模式
- java设计模式学习笔记--适配器模式
- java设计模式学习笔记--代理模式
- java 设计模式学习笔记十二 command命令设计模式
- java 设计模式学习笔记十五 strategy 策略设计模式
- Error occurred during initialization of VM Could not reserve enough space for 2097152KB object heap
- C语言位域与结构体的内存大小
- 打印个东西怎么这么难。。。。
- Java反射初探 ——“当类也学会照镜子”
- PB调用动态SQL语句
- Java设计模式学习笔记4
- 笔试准备(一)-- 数据库
- httpclient
- 焦点事件
- VLSI MP3 音频 编解码芯片
- erlang重点
- HTML 基本格式
- MySQL学习笔记
- Qt 学习之路 2(39):遍历容器