Android 命令模式

作者 : 开心源码 本文共3119个字,预计阅读时间需要8分钟 发布时间: 2022-05-12 共121人阅读

Android 设计模式系列文章 Android 23种设计模式

前言

命令模式,多被用于程序菜单命令。比方遥控器上的左右上下我们可以了解为命令。而命令模式就是把左右上下封装起来。封装过后不论你点击左还是点击上。他们都调用同一个方法,而产生不同的效果。这样把命令和行为分离开来,就是命令模式的核心了。

命令模式定义

将“行为请求者”与“行为实现者”解耦,将一组行为笼统为对象,实现二者之间的松耦合。

命令模式举例

概念不好了解的时候,例子永远是最简单粗暴的解释。下面将举例说明解析命令模式的结构。
例子:按键左右上下,左右模拟音量加减,上下模拟节目加减。
1、我们先实现电视的左右上下功能。

public class Television {    static final String TAG = Television.class.getSimpleName();    public void leftVolumeeduction() {        Log.d(TAG,"减少音量");    }    public void rightVolumeAdd() {        Log.d(TAG,"添加音量");    }    public void upProgramAdd() {        Log.d(TAG,"节目加");    }    public void downProgramEduction() {        Log.d(TAG,"节目减");    }}

于是我们可以了解命令模式的最终接收解决者都是独立的且功能完善。

2、笼统出接口。执行命令

public interface Command {    void execute();}

具体实现各个命令

// 左命令public class LeftCommand implements Command {    private Television tv;    public LeftCommand(Television tv) {        this.tv = tv;    }    @Override    public void execute() {        tv.leftVolumeeduction();    }}// 右命令public class RightCommand implements Command{    private Television tv;    public RightCommand(Television tv) {        this.tv = tv;    }    @Override    public void execute() {        tv.rightVolumeAdd();    }}// 上命令public class UpCommand implements Command {    private Television tv;    public UpCommand(Television tv) {        this.tv = tv;    }    @Override    public void execute() {        tv.upProgramAdd();    }}// 下命令public class DownCommand implements Command{    private Television tv;    public DownCommand(Television tv) {        this.tv = tv;    }    @Override    public void execute() {        tv.downProgramEduction();    }}

现在我们来了解什么叫命令请求和行为解耦。不论你有多少个命令,没次命令都调用同样的请求execute()。而命令对应的行为却不一样。即命令会去自己对应tv的行为。

3、最后我们看一下如何调用的,布局就不贴出来了,很简单就四个button。

public class MainActivity extends AppCompatActivity implements View.OnClickListener{    LeftCommand lfteCommand;    RightCommand rightCommand;    UpCommand upCommand;    DownCommand downCommand;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Button left = (Button) findViewById(R.id.button_left);        Button right = (Button) findViewById(R.id.button_right);        Button up = (Button) findViewById(R.id.button_up);        Button down = (Button) findViewById(R.id.button_down);        left.setOnClickListener(this);        right.setOnClickListener(this);        up.setOnClickListener(this);        down.setOnClickListener(this);        Television tv = new Television();        lfteCommand = new LeftCommand(tv);        rightCommand = new RightCommand(tv);        upCommand =  new UpCommand(tv);        downCommand = new DownCommand(tv);    }    @Override    public void onClick(View view) {        switch (view.getId()) {            case R.id.button_left:                lfteCommand.execute();                break;            case R.id.button_right:                rightCommand.execute();                break;            case R.id.button_up:                upCommand.execute();                break;            case R.id.button_down:                downCommand.execute();                break;            default:                break;        }    }}

依次点击左右上下,输出log如下:

11-13 03:16:00.836 4035-4035/com.yink.designpattern.designpattern D/Television: 减少音量11-13 03:16:02.649 4035-4035/com.yink.designpattern.designpattern D/Television: 添加音量11-13 03:16:04.870 4035-4035/com.yink.designpattern.designpattern D/Television: 节目加11-13 03:16:06.222 4035-4035/com.yink.designpattern.designpattern D/Television: 节目减

<1> 每个命令和view逐个对应。点击buttn对应command.execute()。
<2> 每个command.exucute和tv的具体行为逐个对应。
<3> 我们增加命令或者者修改命令时,用户端view的调用单一,只要要更改命令和tv的具体实现,或者者增加一个新的命令。实现理解耦。

命令模式小结

优点:行为请求和行为实现弱耦合,易扩展,修改,维护
缺点:设计模式通病,大量衍生类的创立。

结束语

这种若耦合的行为设计模式,很好的把行为独立,便于扩展维护。命令模式的格式也不是固定的,在我们平常开发中,只需能把行为笼统出来,都可以命令模式。需要我们注意的是,在平常的开发中,少量普通的操作,原本不复杂的,不需要怎样修改和扩展的,我们还是直接实现功能即可以了。所以在能否使用命令模式上,需要自己判断了。

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Android 命令模式

发表回复