博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(十八)策略模式-代码实现
阅读量:5328 次
发布时间:2019-06-14

本文共 3952 字,大约阅读时间需要 13 分钟。

介绍

概念:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

应用场景:用户主动切换执行规则,比如 画图工具,不同的工具执行的事件效果不同. 压缩工具的格式,不同的格式执行不同的压缩算法.

好处:扩展容易,不会破坏原有的结构,遵循开闭原则。

与状态模式的区别:与状态模式的区别在于切换应对策略的主动权在用户,而状态模式的切换是在内部。

 

例子

代码:

 

//工具基类

package note.com.strategy;/** * 工具基类 * @author lxz * */public abstract class ATool {    public abstract void leftMouseClick();        public abstract void rightMouseClick();        public abstract void leftDoubleMouseClick();    }

//具体工具类

package note.com.strategy;/** * 圆形工具 * @author lxz * */public class Circle extends ATool{    @Override    public void leftMouseClick() {        System.out.println("界面出现了一个圆");            }    @Override    public void rightMouseClick() {        System.out.println("界面出现了圆形的属性菜单");            }    @Override    public void leftDoubleMouseClick() {        System.out.println("界面出现了一个圆");        System.out.println("界面出现了一个圆");            }}
package note.com.strategy;/** * 油漆桶工具 * @author lxz * */public class PaintKettle extends ATool{    @Override    public void leftMouseClick() {        System.out.println("界面出现了填充颜色");            }    @Override    public void rightMouseClick() {        System.out.println("界面出现了油漆桶的属性菜单");            }    @Override    public void leftDoubleMouseClick() {        System.out.println("界面出现了填充颜色,颜色更深了");    }}
package note.com.strategy;/** * 画笔工具 * @author lxz * */public class Pen extends ATool{    @Override    public void leftMouseClick() {        System.out.println("界面出现了一个点");            }    @Override    public void rightMouseClick() {        System.out.println("界面出现了画笔工具的属性菜单");            }    @Override    public void leftDoubleMouseClick() {        System.out.println("界面出现了一个点");            }}
package note.com.strategy;/** * 矩形工具 * @author lxz * */public class Rectangle extends ATool{    @Override    public void leftMouseClick() {        System.out.println("界面出现了一个矩形");            }    @Override    public void rightMouseClick() {        System.out.println("界面出现了矩形工具的属性菜单");            }    @Override    public void leftDoubleMouseClick() {        System.out.println("界面出现了一个矩形");        System.out.println("界面出现了一个矩形");    }}

//画图工具界面类

package note.com.strategy;/** * 管理工具的界面 *  * @author lxz * */public class UI {    private ATool tool = new Pen();// 默认是画笔工具    public static final int PEN = 1;    public static final int RECTANGLE = 2;    public static final int CIRCLE = 3;    public static final int PAINTKETTLE = 4;        public  UI() {        System.out.println("画图工具已经启动");    }        /*     * 切换工具(状态)     */    public void changeTool(int toolNum) {        switch (toolNum) {        case PEN:            tool = new Pen();            break;        case RECTANGLE:            tool = new Rectangle();            break;        case CIRCLE:            tool = new Circle();            break;        case PAINTKETTLE:            tool = new PaintKettle();            break;        default:            tool = new Pen();            break;        }    }        public void leftMouseClick(){        tool.leftMouseClick();    }        public void rightMouseClick(){        tool.rightMouseClick();    }        public void leftDoubleMouseClick(){        tool.leftDoubleMouseClick();    }}

 

//测试类

package note.com.strategy;public class ToolTest {    public static void main(String[] args) {        System.out.println("启动画图工具......");        UI ui = new UI();//启动画图工具        System.out.println("点击画笔工具......");        ui.changeTool(UI.PEN);//点击画笔工具        System.out.println("左键点击画板......");        ui.leftMouseClick();//左键点击画板        System.out.println("点击圆形工具......");        ui.changeTool(UI.CIRCLE);//点击圆形工具        System.out.println("左键双击画板......");        ui.leftDoubleMouseClick();//左键双击画板            }}

 

结果:

启动画图工具......

画图工具已经启动
点击画笔工具......
左键点击画板......
界面出现了一个点
点击圆形工具......
左键双击画板......
界面出现了一个圆
界面出现了一个圆

 

根据选择的工具(策略)不同,执行的操作相应也不同,具有一次改变,次次使用的效果.

 

posted on
2016-03-06 10:55  阅读(
...) 评论(
...) 收藏

转载于:https://www.cnblogs.com/qinggege/p/5246732.html

你可能感兴趣的文章
给C#学习者的建议 - CLR Via C# 读后感
查看>>
Recover Binary Search Tree
查看>>
Java 实践:生产者与消费者
查看>>
[转]IOCP--Socket IO模型终结篇
查看>>
js 获取视频的第一帧
查看>>
各种正则验证
查看>>
观察者模式(Observer)
查看>>
python中numpy.r_和numpy.c_
查看>>
egret3D与2D混合开发,画布尺寸不一致的问题
查看>>
freebsd 实现 tab 命令 补全 命令 提示
查看>>
struts1和struts2的区别
查看>>
函数之匿名函数
查看>>
shell习题第16题:查用户
查看>>
Redis常用命令
查看>>
2018.11.06 bzoj1040: [ZJOI2008]骑士(树形dp)
查看>>
2019.02.15 bzoj5210: 最大连通子块和(链分治+ddp)
查看>>
redis cluster 集群资料
查看>>
微软职位内部推荐-Sr. SE - Office incubation
查看>>
微软职位内部推荐-SOFTWARE ENGINEER II
查看>>
centos系统python2.7更新到3.5
查看>>